fix(merge): 本地整合 - 保留主分支交互与样式并排除不安全用户删除

This commit is contained in:
ddCat
2026-09-07 23:02:34 +08:00
100 changed files with 4845 additions and 865 deletions

View File

@@ -1,5 +1,5 @@
import type { ColumnsType } from "antd/es/table";
import { Eye, Pencil, Power, Trash2 } from "lucide-react";
import { Eye, Pencil, Power } from "lucide-react";
import { formatCredits } from "@/constant/credits";
import { IdentityProviderBadge } from "@/components/layout/identity-provider-badge";
@@ -24,14 +24,12 @@ export function createUserColumns({
onView,
onEdit,
onToggleStatus,
onPurge,
}: {
actorId?: string;
visibleColumns: Set<UserColumnKey>;
onView: (user: AdminUser) => void;
onEdit: (user: AdminUser) => void;
onToggleStatus: (user: AdminUser) => Promise<void>;
onPurge: (user: AdminUser) => void;
}): ColumnsType<AdminUser> {
const columns: Array<ColumnsType<AdminUser>[number] & { key: UserColumnKey }> = [
{
@@ -81,19 +79,6 @@ export function createUserColumns({
},
onClick: () => onToggleStatus(user),
},
{
key: "purge",
label: "删除用户",
icon: <Trash2 className="size-3.5" />,
danger: true,
disabled: user.id === actorId,
confirm: {
title: "彻底删除这个用户?",
description: "该账号及其全部关联数据将被永久移除且不可恢复。停用可保留数据,仅当账号无资金流水和创作内容时才允许删除。",
okText: "彻底删除",
},
onClick: () => onPurge(user),
},
]}
/>
),

View File

@@ -5,7 +5,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { PaginationBar } from "@/components/layout/workspace-page";
import { useDebouncedValue } from "@/hooks/use-debounced-value";
import { bulkDisableAdminUsers, deleteAdminUser, listAdminUsers, purgeAdminUser, updateAdminUser, type AdminUser, type LocalUser } from "@/services/api/auth";
import { bulkDisableAdminUsers, deleteAdminUser, listAdminUsers, updateAdminUser, type AdminUser, type LocalUser } from "@/services/api/auth";
import { useUserStore } from "@/stores/use-user-store";
import { AdminBatchBar, AdminDataTable, AdminTableEmpty } from "../components/admin-ui";
import { useTableUrlState } from "../lib/use-table-url-state";
@@ -102,27 +102,13 @@ export default function UsersPanel({ onUserChanged }: { onUserChanged?: (user: L
}
}, [message, replaceUser]);
const purgeUser = useCallback(async (user: AdminUser) => {
try {
await purgeAdminUser(user.id);
setUsers((items) => items.filter((item) => item.id !== user.id));
setTotal((value) => Math.max(0, value - 1));
setSelectedUserIds((ids) => ids.filter((id) => id !== user.id));
if (detailUserId === user.id) setDetailUserId(null);
message.success(`用户 ${user.displayName || user.username} 已彻底删除`);
} catch (error) {
message.error(error instanceof Error ? error.message : "删除用户失败");
}
}, [detailUserId, message]);
const columns = useMemo(() => createUserColumns({
actorId: actor?.id,
visibleColumns,
onView: (user) => setDetailUserId(user.id),
onEdit: (user) => { setCreateUserOpen(false); setEditingUser(user); },
onToggleStatus: toggleStatus,
onPurge: purgeUser,
}), [actor?.id, purgeUser, toggleStatus, visibleColumns]);
}), [actor?.id, toggleStatus, visibleColumns]);
const resetFilters = () => update({ filter: "", role: "all", status: "all", page: 1 });