Files
Nexus/frontend/src/utils/auditLabels.ts
T

291 lines
8.6 KiB
TypeScript
Raw Normal View History

/** 审计日志 action / target_type 中文展示(与后端 AuditLog.action 对齐) */
const ACTION_LABELS: Record<string, string> = {
// 通用 CRUD
create: '创建',
update: '更新',
delete: '删除',
login: '登录',
logout: '登出',
execute: '执行',
push: '推送',
// 认证 / 会话
login_success: '登录成功',
login_locked: '登录锁定',
login_ip_blocked: '登录 IP 被拒绝',
refresh_invalid_format: '刷新令牌格式无效',
refresh_admin_not_found: '刷新令牌用户不存在',
refresh_version_mismatch: '刷新令牌版本失效',
refresh_token_not_found: '刷新令牌会话不存在',
refresh_legacy_format: '旧版刷新令牌已废弃',
change_password: '修改密码',
setup_totp: '初始化双因素认证',
enable_totp: '启用双因素认证',
disable_totp: '禁用双因素认证',
webssh_token: '签发 WebSSH 令牌',
// 服务器 / Agent
create_server: '创建服务器',
update_server: '更新服务器',
delete_server: '删除服务器',
import_servers: '导入服务器',
generate_agent_key: '生成 Agent 密钥',
install_agent: '安装 Agent',
uninstall_agent: '卸载 Agent',
upgrade_agent: '升级 Agent',
reveal_install_cmd: '查看安装命令',
batch_install_agent: '批量安装 Agent',
batch_upgrade_agent: '批量升级 Agent',
batch_uninstall_agent: '批量卸载 Agent',
batch_detect_path: '批量检测路径',
// 资产
create_platform: '创建平台',
update_platform: '更新平台',
delete_platform: '删除平台',
create_node: '创建节点',
update_node: '更新节点',
delete_node: '删除节点',
// 脚本 / 凭据 / 执行
create_script: '创建脚本',
update_script: '更新脚本',
delete_script: '删除脚本',
create_credential: '创建数据库凭据',
update_credential: '更新数据库凭据',
delete_credential: '删除数据库凭据',
execute_started: '开始执行脚本',
execute_command: '执行脚本',
stop_execution: '停止脚本执行',
mark_stuck: '标记执行卡住',
retry_execution: '重试脚本执行',
server_auto_stuck: '服务器执行超时卡住',
auto_stuck: '执行超时自动标记',
script_job_callback: '脚本任务回调',
// 终端 / WebSSH
create_quick_command: '添加快捷命令',
update_quick_command: '更新快捷命令',
delete_quick_command: '删除快捷命令',
reorder_quick_commands: '调整快捷命令顺序',
webssh_connect: 'WebSSH 连接',
webssh_disconnect: 'WebSSH 断开',
// 系统设置
reveal_api_key: '查看 API 密钥',
update_setting: '更新系统设置',
create_schedule: '创建推送调度',
update_schedule: '更新推送调度',
delete_schedule: '删除推送调度',
create_preset: '创建密码预设',
update_preset: '更新密码预设',
delete_preset: '删除密码预设',
reveal_preset: '查看密码预设',
create_ssh_key_preset: '创建 SSH 密钥预设',
update_ssh_key_preset: '更新 SSH 密钥预设',
delete_ssh_key_preset: '删除 SSH 密钥预设',
reveal_ssh_key_preset: '查看 SSH 密钥预设',
reveal_telegram_token: '查看 Telegram Token',
parse_subscription: '解析订阅节点',
update_ip_allowlist: '更新登录 IP 白名单',
toggle_ip_allowlist: '开关登录 IP 白名单',
add_manual_ips: '添加白名单 IP',
remove_allowlist_ip: '移除白名单 IP',
retry_job: '手动重试推送',
delete_retry: '删除重试任务',
// 同步 / 文件
sync_files: '文件推送',
sync_preview: '推送预览',
sync_cancel: '取消推送',
sync_verify: '推送校验',
validate_source_path: '验证源路径',
sync_push: '文件推送',
file_copy: '复制远程文件',
file_move: '移动远程文件',
file_delete: '删除远程文件',
file_rename: '重命名远程文件',
file_mkdir: '新建远程目录',
browse_directory: '浏览远程目录',
file_diff: '对比远程文件',
file_upload: '上传文件到服务器',
file_download: '从服务器下载文件',
file_read: '读取远程文件',
file_write: '写入远程文件',
file_permission_change: '修改文件权限',
file_compress: '压缩远程文件',
file_decompress: '解压远程文件',
local_file_delete: '删除本地文件',
local_file_rename: '重命名本地文件',
local_file_preview: '预览本地文件',
upload_zip: '上传并解压 ZIP',
diagnose: '服务器诊断',
chmod: '修改权限',
chown: '修改属主',
}
const TARGET_LABELS: Record<string, string> = {
server: '服务器',
schedule: '调度',
script: '脚本',
credential: '数据库凭据',
db_credential: '数据库凭据',
admin: '管理员',
setting: '系统设置',
quick_command: '快捷命令',
retry: '重试任务',
sync: '同步',
file: '文件',
webssh: '终端会话',
platform: '平台',
node: '节点',
script_execution: '脚本执行',
preset: '密码预设',
ssh_key_preset: 'SSH 密钥预设',
}
/** 常见英文片段 → 中文(用于未登记 action 的兜底) */
const TOKEN_ZH: Record<string, string> = {
create: '创建',
update: '更新',
delete: '删除',
batch: '批量',
reveal: '查看',
install: '安装',
uninstall: '卸载',
upgrade: '升级',
import: '导入',
export: '导出',
generate: '生成',
execute: '执行',
retry: '重试',
stop: '停止',
mark: '标记',
auto: '自动',
stuck: '卡住',
server: '服务器',
script: '脚本',
file: '文件',
sync: '同步',
push: '推送',
quick: '快捷',
command: '命令',
commands: '命令',
preset: '预设',
schedule: '调度',
setting: '设置',
platform: '平台',
node: '节点',
credential: '凭据',
admin: '管理员',
login: '登录',
logout: '登出',
webssh: 'WebSSH',
connect: '连接',
disconnect: '断开',
token: '令牌',
permission: '权限',
change: '变更',
reorder: '排序',
local: '本地',
remote: '远程',
preview: '预览',
verify: '验证',
validate: '验证',
browse: '浏览',
directory: '目录',
upload: '上传',
download: '下载',
read: '读取',
write: '写入',
copy: '复制',
move: '移动',
rename: '重命名',
mkdir: '新建目录',
compress: '压缩',
decompress: '解压',
diagnose: '诊断',
parse: '解析',
subscription: '订阅',
allowlist: '白名单',
manual: '手动',
ips: 'IP',
ip: 'IP',
telegram: 'Telegram',
agent: 'Agent',
job: '任务',
execution: '执行',
started: '开始',
success: '成功',
locked: '锁定',
blocked: '被拒绝',
invalid: '无效',
format: '格式',
version: '版本',
mismatch: '不匹配',
not: '未',
found: '找到',
legacy: '旧版',
totp: '双因素认证',
password: '密码',
key: '密钥',
api: 'API',
ssh: 'SSH',
detect: '检测',
path: '路径',
cancel: '取消',
diff: '对比',
zip: 'ZIP',
callback: '回调',
}
function fallbackActionLabel(action: string): string {
const parts = action.toLowerCase().split('_').filter(Boolean)
if (parts.length === 0) return '—'
const zh = parts.map((p) => TOKEN_ZH[p] ?? p)
return zh.join('')
}
export function auditActionLabel(action: string): string {
if (!action) return '—'
const key = action.trim()
if (ACTION_LABELS[key]) return ACTION_LABELS[key]
return fallbackActionLabel(key)
}
export function auditTargetLabel(type: string): string {
if (!type) return '—'
const key = type.trim()
if (TARGET_LABELS[key]) return TARGET_LABELS[key]
return fallbackActionLabel(key)
}
/** 审计页「操作类型」筛选(中文标签 + 英文 value) */
export const auditActionFilterOptions: { label: string; value: string }[] = [
{ label: '登录成功', value: 'login_success' },
{ label: '登出', value: 'logout' },
{ label: '修改密码', value: 'change_password' },
{ label: '创建服务器', value: 'create_server' },
{ label: '更新服务器', value: 'update_server' },
{ label: '删除服务器', value: 'delete_server' },
{ label: '文件推送', value: 'sync_files' },
{ label: '执行脚本', value: 'execute_command' },
{ label: 'WebSSH 连接', value: 'webssh_connect' },
{ label: '写入远程文件', value: 'file_write' },
{ label: '更新系统设置', value: 'update_setting' },
{ label: '手动重试推送', value: 'retry_job' },
]
export function auditSummary(item: {
action: string
resource_type?: string
target_type?: string
detail?: string | null
}): string {
const type = item.resource_type || item.target_type || ''
const base = `${auditActionLabel(item.action)} · ${auditTargetLabel(type)}`
const detail = (item.detail || '').trim()
return detail ? `${base}${detail}` : base
}