feat(v2.7): 收口治理权限适配器

This commit is contained in:
2026-07-08 16:44:57 +08:00
parent 9ba9449c1a
commit f69ec83193
14 changed files with 214 additions and 16 deletions

View File

@@ -5,6 +5,7 @@ import { Download, Plus, RefreshCcw, Trash2, Upload } from 'lucide-react';
import { RouteGuard } from '@/components/auth/Guard';
import { api } from '@/lib/api';
import { useAuthStore } from '@/stores/useAuthStore';
import { useMemberStore } from '@/stores/useMemberStore';
type GovernanceKind = 'task_category' | 'requirement_type' | 'requirement_platform' | 'requirement_source';
@@ -26,12 +27,14 @@ const KIND_LABEL: Record<GovernanceKind, string> = {
function GovernancePageInner() {
const user = useAuthStore((s) => s.user);
const role = useMemberStore((s) => s.roles.find((item) => item.id === user?.roleId));
const [kind, setKind] = useState<GovernanceKind>('task_category');
const [items, setItems] = useState<GovernanceItem[]>([]);
const [name, setName] = useState('');
const [group, setGroup] = useState('other');
const [exportText, setExportText] = useState('');
const actorId = user?.id ?? '';
const permissions = role?.permissions ?? [];
const reload = async () => {
const rows = await api.get<GovernanceItem[]>(`/governance/dictionaries?kind=${kind}`);
@@ -44,14 +47,14 @@ function GovernancePageInner() {
const create = async () => {
if (!actorId || !name.trim()) return;
await api.post('/governance/dictionaries', { actorId, kind, name: name.trim(), group });
await api.post('/governance/dictionaries', { actorId, permissions, kind, name: name.trim(), group });
setName('');
await reload();
};
const remove = async (item: GovernanceItem) => {
if (!actorId) return;
await api.deleteWithBody(`/governance/dictionaries/${kind}/${item.id}`, { actorId });
await api.deleteWithBody(`/governance/dictionaries/${kind}/${item.id}`, { actorId, permissions });
await reload();
};
@@ -66,7 +69,7 @@ function GovernancePageInner() {
const sourceItems = Array.isArray(parsed.items)
? parsed.items
: [...(parsed.dictionaries ?? []), ...(parsed.taskCategories ?? []).map((item: GovernanceItem) => ({ ...item, kind: 'task_category' }))];
await api.post('/governance/import', { actorId, items: sourceItems });
await api.post('/governance/import', { actorId, permissions, items: sourceItems });
await reload();
};