@ basenative/admin
BaseNative应用程序的可插拔管理和审核界面。汇集了 每个“用户可以提交内容,mod可以批准”的四个部分 从头开始重建应用程序:
- 角色 -分层 (
user < moderator < admin) 可播种 从部署时允许列表进行管理升级。 - 队列 -提交表→批准的目标表,逐行 决定自动填充的审核列。
- 审计日志 -每个受保护的行动记录谁做了什么,什么时候,和 到哪个目标—在审计时不会使请求崩溃 写失败。
- 用户界面 -服务器渲染的构建块 (
<AdminQueueList>,<AdminUserList>) 与@basenative/components和主题 通过CSS自定义属性。
Worker-runtime第一;在存储适配器允许的节点上运行良好。
安装
pnpm add @basenative/admin
# Optional — gets you sessions/cookies for `getCurrentUser`
pnpm add @basenative/auth
角色
import { defineRoles, requireRole, roleSeed } from '@basenative/admin/roles';
const roles = defineRoles({ hierarchy: ['user', 'moderator', 'admin'] });
roles.isAdmin(user); // top tier?
roles.isModerator(user); // ≥ moderator (admin counts)
roles.hasRole(user, 'moderator');
// Inside a handler:
const guard = requireRole('moderator');
const { user, error } = guard(currentUser);
if (error) return error;
从env进行播种管理
提升中列出的句柄 ADMIN_HANDLES (逗号分隔)第一眼看到:
user = await roleSeed({
env, envKey: 'ADMIN_HANDLES',
user,
setRole: (id, role, by) => d1Users(env.DB).setRole(id, role, by),
});
提交队列
import { defineQueue } from '@basenative/admin/queue';
const queue = defineQueue({
db: env.DB,
tables: { submissions: 'submissions', target: 'phrases', columns: ['category', 'phrase'] },
});
await queue.submit({ category: 'Foods', phrase: 'apple pie', submittedBy: 'alice' });
const pending = await queue.listPending();
await queue.decide(pending[0].id, 'approved', 'mod1');
在批准的行被复制到目标表与 created_at /
created_by 由主持人的决定填充。覆盖 onApprove
如果你需要定制的推广逻辑。
dropin处理程序
import { defineAdminHandlers } from '@basenative/admin/handlers';
import { currentUser } from '@basenative/auth';
const admin = defineAdminHandlers({
queue,
users: d1Users(env.DB),
getCurrentUser: currentUser,
});
// functions/api/moderate/pending.js
export const onRequestGet = admin.listPending;
// functions/api/moderate/decide.js
export const onRequestPost = admin.decide;
// functions/api/moderate/users.js
export const onRequestGet = admin.users;
// functions/api/moderate/promote.js
export const onRequestPost = admin.promote;
审计日志
import { auditAction } from '@basenative/admin/audit';
await auditAction(env, {
user,
action: 'submission.approved',
target: { type: 'submission', id: 42 },
meta: { reason: 'duplicate' },
});
审计失败被捕获并记录-它们永远不会冒泡到用户。
UI组件
import { renderAdminQueueList, renderAdminUserList } from '@basenative/admin/components';
const html = renderAdminQueueList({ items: pending });
const usersHtml = renderAdminUserList({
users: elevated,
results,
query: q,
currentHandle: me.handle,
});
主题通过CSS变量- --bn-admin-bg, --bn-admin-fg,
--bn-admin-accent, --bn-admin-ok, --bn-admin-bad,
--bn-admin-danger.
动作委托:每个按钮携带 data-action="bn-admin-decide" (或
bn-admin-set-role) + data-id / data-decision / data-role. 线
分派到您的API的单个文档级单击处理程序。
迁移
应用 migrations/0001_audit_and_roles.sql (也输出为
AUDIT_MIGRATION)。
采用增量
您可以以任何顺序拉入位:
- 从……开始
roles-最便宜的表面积;只是包装角色检查。 - 添加
audit接下来开始记录您已经拥有的受保护操作。 - 将您的队列端点替换为
handlers一旦数据形状向上行。 - 交换您的队列UI
components最后的。
链接
- 碱性单氧- https://github.com/DuganLabs/basenative
- 问题- - - - - - https://github.com/DuganLabs/basenative/issues
- 文档- https://github.com/DuganLabs/basenative#readme
许可证
apache - 2.0。