更新navigation里的权限控制 & 更新客户认领查询逻辑
This commit is contained in:
@@ -3,9 +3,10 @@ import { zodResolver } from "@hookform/resolvers/zod"
|
||||
import { format } from "date-fns"
|
||||
import { Suspense, useCallback, useState } from "react"
|
||||
import { Controller, useForm } from "react-hook-form"
|
||||
import { toast } from "sonner"
|
||||
import { z } from "zod"
|
||||
import { bindAdmin, getPageUsers } from "@/actions/user"
|
||||
import { DataTable, useDataTable } from "@/components/data-table"
|
||||
import { bindAdmin, getPageUser } from "@/actions/user"
|
||||
import { DataTable } from "@/components/data-table"
|
||||
import { Badge } from "@/components/ui/badge"
|
||||
import { Button } from "@/components/ui/button"
|
||||
import {
|
||||
@@ -15,66 +16,84 @@ import {
|
||||
FieldLabel,
|
||||
} from "@/components/ui/field"
|
||||
import { Input } from "@/components/ui/input"
|
||||
import { useFetch } from "@/hooks/data"
|
||||
import type { User } from "@/models/user"
|
||||
|
||||
type FilterValues = {
|
||||
interface UserQueryParams {
|
||||
account?: string
|
||||
name?: string
|
||||
identified?: boolean
|
||||
enabled?: boolean
|
||||
assigned?: boolean
|
||||
}
|
||||
|
||||
const filterSchema = z.object({
|
||||
account: z.string().optional(),
|
||||
name: z.string().optional(),
|
||||
identified: z.string().optional(),
|
||||
enabled: z.string().optional(),
|
||||
assigned: z.string().optional(),
|
||||
})
|
||||
|
||||
type FormValues = z.infer<typeof filterSchema>
|
||||
|
||||
export default function UserPage() {
|
||||
const [filters, setFilters] = useState<FilterValues>({})
|
||||
const [userList, setUserList] = useState<User[]>([])
|
||||
const [loading, setLoading] = useState(false)
|
||||
|
||||
const { control, handleSubmit, reset } = useForm<FormValues>({
|
||||
resolver: zodResolver(filterSchema),
|
||||
defaultValues: {
|
||||
account: "",
|
||||
name: "",
|
||||
identified: "all",
|
||||
enabled: "all",
|
||||
assigned: "all",
|
||||
},
|
||||
})
|
||||
|
||||
const fetchUsers = useCallback(
|
||||
(page: number, size: number) => getPageUsers({ page, size, ...filters }),
|
||||
[filters],
|
||||
const fetchUsers = useCallback(async (filters: UserQueryParams = {}) => {
|
||||
setLoading(true)
|
||||
try {
|
||||
const res = await getPageUser(filters)
|
||||
console.log(res, "res")
|
||||
|
||||
if (res.success) {
|
||||
const req = [{ ...res.data }]
|
||||
setUserList(req)
|
||||
} else {
|
||||
toast.error(res.message || "获取用户失败")
|
||||
setUserList([])
|
||||
}
|
||||
} catch (error) {
|
||||
const message = error instanceof Error ? error.message : error
|
||||
toast.error(`获取管理员失败: ${message}`)
|
||||
} finally {
|
||||
setLoading(false)
|
||||
}
|
||||
}, [])
|
||||
|
||||
const bind = useCallback(
|
||||
async (id: number) => {
|
||||
try {
|
||||
const res = await bindAdmin({ id })
|
||||
if (res.success) {
|
||||
toast.success("用户已认领")
|
||||
fetchUsers()
|
||||
} else {
|
||||
toast.error(res.message || "认领失败")
|
||||
}
|
||||
} catch (error) {
|
||||
const message = error instanceof Error ? error.message : error
|
||||
toast.error(`认领请求失败: ${message}`)
|
||||
}
|
||||
},
|
||||
[fetchUsers],
|
||||
)
|
||||
|
||||
const table = useDataTable<User>(fetchUsers)
|
||||
const bind = useFetch(table, (id: number) => bindAdmin({ id }), {
|
||||
done: "用户已认领",
|
||||
fail: "用户认领失败",
|
||||
})
|
||||
const onFilter = handleSubmit((data: FormValues) => {
|
||||
const params: UserQueryParams = {}
|
||||
|
||||
const onFilter = handleSubmit(data => {
|
||||
const result: FilterValues = {}
|
||||
|
||||
if (data.account) result.account = data.account
|
||||
if (data.name) result.name = data.name
|
||||
if (data.identified && data.identified !== "all")
|
||||
result.identified = data.identified === "1"
|
||||
if (data.enabled && data.enabled !== "all")
|
||||
result.enabled = data.enabled === "1"
|
||||
if (data.assigned && data.assigned !== "all")
|
||||
result.assigned = data.assigned === "has"
|
||||
|
||||
setFilters(result)
|
||||
table.pagination.onPageChange(1)
|
||||
if (data.account?.trim()) params.account = data.account.trim()
|
||||
if (data.name?.trim()) params.name = data.name.trim()
|
||||
const hasValidFilter = Object.keys(params).length > 0
|
||||
if (hasValidFilter) {
|
||||
fetchUsers(params)
|
||||
} else {
|
||||
setUserList([])
|
||||
setLoading(false)
|
||||
toast.info("请输入筛选条件后再查询")
|
||||
}
|
||||
})
|
||||
|
||||
return (
|
||||
@@ -110,69 +129,6 @@ export default function UserPage() {
|
||||
</Field>
|
||||
)}
|
||||
/>
|
||||
|
||||
{/* <Controller
|
||||
name="identified"
|
||||
control={control}
|
||||
render={({ field, fieldState }) => (
|
||||
<Field data-invalid={fieldState.invalid} className="w-24">
|
||||
<FieldLabel>实名状态</FieldLabel>
|
||||
<Select value={field.value} onValueChange={field.onChange}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="全部" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="all">全部</SelectItem>
|
||||
<SelectItem value="1">已认证</SelectItem>
|
||||
<SelectItem value="0">未认证</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
/>
|
||||
|
||||
<Controller
|
||||
name="enabled"
|
||||
control={control}
|
||||
render={({ field, fieldState }) => (
|
||||
<Field data-invalid={fieldState.invalid} className="w-24">
|
||||
<FieldLabel>账号状态</FieldLabel>
|
||||
<Select value={field.value} onValueChange={field.onChange}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="全部" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="all">全部</SelectItem>
|
||||
<SelectItem value="1">正常</SelectItem>
|
||||
<SelectItem value="0">禁用</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
/>
|
||||
|
||||
<Controller
|
||||
name="assigned"
|
||||
control={control}
|
||||
render={({ field, fieldState }) => (
|
||||
<Field data-invalid={fieldState.invalid} className="w-24">
|
||||
<FieldLabel>认领状态</FieldLabel>
|
||||
<Select value={field.value} onValueChange={field.onChange}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="全部" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="all">全部</SelectItem>
|
||||
<SelectItem value="has">已认领</SelectItem>
|
||||
<SelectItem value="none">未认领</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
/> */}
|
||||
</div>
|
||||
|
||||
<FieldGroup className="flex-row justify-start mt-4 gap-2">
|
||||
@@ -181,15 +137,9 @@ export default function UserPage() {
|
||||
type="button"
|
||||
variant="outline"
|
||||
onClick={() => {
|
||||
reset({
|
||||
account: "",
|
||||
name: "",
|
||||
identified: "all",
|
||||
enabled: "all",
|
||||
assigned: "all",
|
||||
})
|
||||
setFilters({})
|
||||
table.pagination.onPageChange(1)
|
||||
reset()
|
||||
setUserList([])
|
||||
setLoading(false)
|
||||
}}
|
||||
>
|
||||
重置
|
||||
@@ -199,7 +149,8 @@ export default function UserPage() {
|
||||
|
||||
<Suspense>
|
||||
<DataTable<User>
|
||||
{...table}
|
||||
data={userList || []}
|
||||
status={loading ? "load" : "done"}
|
||||
columns={[
|
||||
{ header: "ID", accessorKey: "id" },
|
||||
{ header: "账号", accessorKey: "username" },
|
||||
|
||||
Reference in New Issue
Block a user