v0.12.0 PG 16→18.6 + 备份系统(pg_basebackup 全量/增量+S3 归档+保留链)+ RBAC 用户分层(content/commerce/system)

This commit is contained in:
bigcode
2026-11-04 08:29:05 +08:00
parent b16c33c08b
commit 4fba80a216
14 changed files with 794 additions and 52 deletions
+17 -2
View File
@@ -4,7 +4,7 @@
* 服务端有防锁死保护:最后一个 admin 不可降级。
*/
import { createFileRoute, useRouter } from "@tanstack/react-router";
import { App, Button, Card, Form, Input, Modal, Select, Space, Table, Tag } from "antd";
import { App, Button, Card, Form, Input, Modal, Select, Space, Table, Tabs, Tag } from "antd";
import { KeyRound, Search, UserPlus } from "lucide-react";
import { getCurrentUser } from "~/server/auth";
import { useState } from "react";
@@ -17,12 +17,17 @@ export const Route = createFileRoute("/admin/users")({
const page = Math.floor(Number(search.page)) || 0;
if (page > 1) out.page = page;
if (typeof search.q === "string" && search.q) out.q = search.q;
// 用户类型 Tab:backend 后台用户 / customer 普通用户
if (search.kind === "backend" || search.kind === "customer") out.kind = search.kind;
return out;
},
loaderDeps: ({ search }) => ({ search }),
loader: ({ deps }) =>
guardAdmin(async () => {
const [user, me] = await Promise.all([adminListUsers({ data: { page: deps.search.page, q: deps.search.q || undefined } }), getCurrentUser()]);
const [user, me] = await Promise.all([
adminListUsers({ data: { page: deps.search.page, q: deps.search.q || undefined, kind: deps.search.kind } }),
getCurrentUser(),
]);
return { users: user, me };
}),
component: UsersPage,
@@ -114,6 +119,16 @@ function UsersPage() {
</Space>
}
/>
{/* 用户类型分层:后台用户(admin/editor/manager)可登录后台;普通用户(customer)仅商城账号 */}
<Tabs
activeKey={search.kind ?? ""}
onChange={(key) => void navigate({ search: (prev) => ({ ...prev, kind: key || undefined, page: 1 }) })}
items={[
{ key: "", label: "全部" },
{ key: "backend", label: "后台用户" },
{ key: "customer", label: "普通用户" },
]}
/>
<Table
rowKey="id"
size="small"