'use client' import { useState, useEffect } from 'react' import Table, { Column } from '@/components/ui/Table' import Button from '@/components/ui/Button' import Input from '@/components/ui/Input' import Modal from '@/components/ui/Modal' import Badge from '@/components/ui/Badge' import { Plus, Trash2, Copy, CheckCircle } from 'lucide-react' interface ApiKeyItem { id: number; name: string; permissions: string; last_used_at: string | null; expires_at: string | null; is_active: number; created_at: string } export default function ApiKeysPage() { const [keys, setKeys] = useState([]) const [loading, setLoading] = useState(true) const [createOpen, setCreateOpen] = useState(false) const [name, setName] = useState('') const [saving, setSaving] = useState(false) const [newKey, setNewKey] = useState(null) const [deleteTarget, setDeleteTarget] = useState(null) const [copied, setCopied] = useState(false) const [error, setError] = useState('') async function fetchKeys() { const res = await fetch('/api/api-keys') if (res.ok) { const data = await res.json(); setKeys(data.keys) } } useEffect(() => { fetchKeys().finally(() => setLoading(false)) }, []) async function handleCreate() { if (!name.trim()) return setSaving(true); setError('') try { const res = await fetch('/api/api-keys', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: name.trim() }), }) const data = await res.json() if (!res.ok) { setError(data.error || '创建失败'); return } setNewKey(data.key) setCreateOpen(false) setName('') fetchKeys() } catch { setError('创建失败') } finally { setSaving(false) } } async function toggleActive(k: ApiKeyItem) { await fetch(`/api/api-keys/${k.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ is_active: k.is_active ? 0 : 1 }), }) fetchKeys() } async function handleDelete() { if (!deleteTarget) return const res = await fetch(`/api/api-keys/${deleteTarget.id}`, { method: 'DELETE' }) if (res.ok) { setDeleteTarget(null); fetchKeys() } } function copyKey() { if (newKey) { navigator.clipboard.writeText(newKey) setCopied(true) setTimeout(() => setCopied(false), 2000) } } const columns: Column[] = [ { key: 'name', title: '名称', render: (r) => {r.name} }, { key: 'permissions', title: '权限', render: (r) => { const perms: string[] = JSON.parse(r.permissions) return
{perms.map(p => {p})}
}}, { key: 'is_active', title: '状态', render: (r) => }, { key: 'last_used_at', title: '最后使用', render: (r) => r.last_used_at || '从未使用' }, { key: 'expires_at', title: '过期时间', render: (r) => r.expires_at || '永不过期' }, { key: 'created_at', title: '创建时间' }, { key: 'actions', title: '操作', render: (r) => ( )}, ] return (

API Key 管理

用于第三方系统调用资产系统 API

{newKey && (

API Key 已创建(仅显示一次,请妥善保存)

{newKey}
)} {loading ?
加载中...
: r.id} />} setCreateOpen(false)} title="创建 API Key" footer={ <> }>
setName(e.target.value)} placeholder="例如:监控系统" />

默认权限:assets:read(仅读取资产数据)

{error &&

{error}

}
setDeleteTarget(null)} title="确认删除" footer={ <> }>

确定要删除 API Key「{deleteTarget?.name}」吗?使用该 Key 的应用将无法访问。

) }