fix(audit): 审计日志操作与目标类型全面中文化

补全 action/target 映射表与词段兜底;审计页筛选下拉使用中文标签。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Your Name
2026-06-01 22:18:42 +08:00
parent 44c19f329a
commit b62d4f6f9f
3 changed files with 254 additions and 23 deletions
@@ -0,0 +1,14 @@
# 2026-06-01 审计日志操作中文展示
## 摘要
补全审计日志 `action` / `target_type` 中文映射(覆盖登录、服务器、脚本、文件、设置等全部后端动作);未登记动作按词段智能兜底为中文。审计页筛选下拉同步为中文标签。
## 涉及文件
- `frontend/src/utils/auditLabels.ts`
- `frontend/src/pages/AuditPage.vue`
## 验证
打开 `/#/audit`,「操作」列与筛选器应显示中文(如「登录成功」「文件推送」「写入远程文件」),不再出现 `create_server` 等英文蛇形命名。
+3 -11
View File
@@ -13,7 +13,7 @@
variant="outlined"
density="compact"
hide-details
style="max-width: 160px"
style="max-width: 200px"
clearable
@update:model-value="page = 1; loadAudit()"
/>
@@ -97,7 +97,7 @@ import { ref, onMounted } from 'vue'
import { http } from '@/api'
import { useSnackbar } from '@/composables/useSnackbar'
import type { PaginatedResponse, AuditItem } from '@/types/api'
import { auditActionLabel, auditTargetLabel } from '@/utils/auditLabels'
import { auditActionLabel, auditTargetLabel, auditActionFilterOptions } from '@/utils/auditLabels'
import { normalizeAuditList } from '@/utils/auditNormalize'
const snackbar = useSnackbar()
@@ -111,15 +111,7 @@ const actionFilter = ref<string | null>(null)
const userFilter = ref('')
const dateFilter = ref('')
const actionOptions = [
{ label: '创建', value: 'create' },
{ label: '更新', value: 'update' },
{ label: '删除', value: 'delete' },
{ label: '登录', value: 'login' },
{ label: '登出', value: 'logout' },
{ label: '执行', value: 'execute' },
{ label: '推送', value: 'push' },
]
const actionOptions = auditActionFilterOptions
const headers = [
{ title: '操作', key: 'action', width: 100 },
+237 -12
View File
@@ -1,6 +1,7 @@
/** 审计日志 action / target_type 中文展示 */
/** 审计日志 action / target_type 中文展示(与后端 AuditLog.action 对齐) */
const ACTION_LABELS: Record<string, string> = {
// 通用 CRUD
create: '创建',
update: '更新',
delete: '删除',
@@ -8,31 +9,128 @@ const ACTION_LABELS: Record<string, string> = {
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: '删除服务器',
create_schedule: '创建调度',
update_schedule: '更新调度',
delete_schedule: '删除调度',
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: '删除快捷命令',
retry_job: '手动重试',
delete_retry: '删除重试任务',
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: '修改属主',
file_write: '写入文件',
file_delete: '删除文件',
sync_push: '文件推送',
}
const TARGET_LABELS: Record<string, string> = {
server: '服务器',
schedule: '调度',
script: '脚本',
credential: '凭据',
credential: '数据库凭据',
db_credential: '数据库凭据',
admin: '管理员',
setting: '系统设置',
quick_command: '快捷命令',
@@ -40,18 +138,145 @@ const TARGET_LABELS: Record<string, string> = {
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 '—'
return ACTION_LABELS[action] ?? action.replace(/_/g, ' ')
const key = action.trim()
if (ACTION_LABELS[key]) return ACTION_LABELS[key]
return fallbackActionLabel(key)
}
export function auditTargetLabel(type: string): string {
if (!type) return '—'
return TARGET_LABELS[type] ?? type.replace(/_/g, ' ')
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