左侧栏 ProjectNav:项目完整列表(名 + 短 id + 我的角色, 选中高亮,点击切换)+ 创建项目(名/GitHub 仓库/repo_url) + 选中项目成员(邀请/改角色/新增移除);工作台删除 sec-projects 一节与任务列表里的项目下拉框,侧栏为唯一 项目选择器,自动选第一个项目逻辑不变。 薄模块补齐(均为已核实后端路由):成员移除 DELETE、 自动化详情(GET 单条 + 产出)与编辑 PATCH、分诊条目点进 任务/自动化详情、Workers 搜索与在线筛选、管理区设置配额 POST。主线新功能(Todos、Browser、taskMeta 等)原样保留, 未做任何回退。console 标记单测本地 53 项通过。
33 lines
1.4 KiB
TypeScript
33 lines
1.4 KiB
TypeScript
import { useState } from "react";
|
|
import { useConsole } from "../context";
|
|
import { Card, Bar } from "../components/ui";
|
|
|
|
export default function AdminSection() {
|
|
const ctx = useConsole();
|
|
const [setUser, setSetUser] = useState("");
|
|
const [setUsd, setSetUsd] = useState("");
|
|
return (
|
|
<Card id="adminCard" title={<>管理区 <span className="muted">(仅全局管理员)</span></>}>
|
|
<div className="muted">{ctx.adminGate}</div>
|
|
{ctx.adminBody ? (
|
|
<>
|
|
<Bar>
|
|
<input type="text" placeholder="要查配额的用户 id" value={ctx.adminUserId} onChange={(e) => ctx.setAdminUserId(e.target.value)} />
|
|
<button onClick={ctx.adminQuota}>查该用户配额</button>
|
|
</Bar>
|
|
<Bar>
|
|
<input type="text" placeholder="要设置配额的用户 id" value={setUser} onChange={(e) => setSetUser(e.target.value)} />
|
|
<input type="text" placeholder="美元配额(留空 = 不限额)" value={setUsd} onChange={(e) => setSetUsd(e.target.value)} />
|
|
<button className="primary" onClick={() => ctx.adminSetQuota(setUser, setUsd)}>设置配额</button>
|
|
</Bar>
|
|
<Bar>
|
|
<button onClick={ctx.adminSweep}>手动触发 sweep(清理陈旧 running 任务)</button>
|
|
<button onClick={ctx.adminBackup}>手动触发备份</button>
|
|
</Bar>
|
|
<div className="muted">{ctx.adminResult}</div>
|
|
</>
|
|
) : null}
|
|
</Card>
|
|
);
|
|
}
|