Files
oci-portal-dash/src/composables/useActionLabel.ts
T
wangdefa 08fa529348
CI / test (push) Successful in 27s
Release / release (push) Successful in 28s
登录页加载态、日志动作补齐与绑定按钮禁用态
2026-07-14 11:01:09 +08:00

108 lines
5.5 KiB
TypeScript

/**
* 系统日志「动作」中文化:路由模板 + 方法 → 人话描述。
* 精确匹配优先,未命中回退资源段兜底;新增路由不强求登记,兜底可读。
*/
const exact: Record<string, string> = {
'POST /api/v1/auth/login': '登录面板',
'POST /api/v1/auth/logout': '退出登录',
'GET /api/v1/auth/oauth/:provider/callback': '外部身份登录 / 绑定',
'PUT /api/v1/auth/credentials': '修改登录凭据',
'PUT /api/v1/auth/password-login': '切换密码登录开关',
'POST /api/v1/auth/revoke-sessions': '撤销全部会话',
'POST /api/v1/auth/totp/setup': '发起两步验证绑定',
'POST /api/v1/auth/totp/activate': '启用两步验证',
'POST /api/v1/auth/totp/disable': '停用两步验证',
'DELETE /api/v1/auth/identities/:id': '解绑外部身份',
'PUT /api/v1/settings/telegram': '保存 Telegram 通知配置',
'POST /api/v1/settings/telegram/test': '发送通知测试消息',
'PUT /api/v1/settings/notify-events': '保存通知管理开关',
'PUT /api/v1/settings/task': '保存任务设置',
'PUT /api/v1/settings/security': '保存安全设置',
'PUT /api/v1/settings/oauth': '保存登录方式配置',
'POST /api/v1/oci-configs': '导入租户 API Key',
'PUT /api/v1/oci-configs/:id': '修改租户配置',
'DELETE /api/v1/oci-configs/:id': '删除租户配置',
'POST /api/v1/oci-configs/:id/verify': '租户测活',
'POST /api/v1/oci-configs/:id/region-subscriptions': '订阅区域',
'POST /api/v1/oci-configs/:id/instances': '创建实例',
'PUT /api/v1/oci-configs/:id/instances/:instanceId': '修改实例配置',
'DELETE /api/v1/oci-configs/:id/instances/:instanceId': '终止实例',
'POST /api/v1/oci-configs/:id/instances/:instanceId/action': '实例电源操作',
'POST /api/v1/oci-configs/:id/instances/:instanceId/change-public-ip': '更换公网 IP',
'POST /api/v1/oci-configs/:id/instances/:instanceId/ipv6-addresses': '添加 IPv6 地址',
'DELETE /api/v1/oci-configs/:id/instances/:instanceId/ipv6-addresses': '删除 IPv6 地址',
'POST /api/v1/oci-configs/:id/instances/:instanceId/replace-boot-volume': '更换引导卷',
'POST /api/v1/oci-configs/:id/users': '创建租户用户',
'PUT /api/v1/oci-configs/:id/users/:userId': '修改租户用户',
'DELETE /api/v1/oci-configs/:id/users/:userId': '删除租户用户',
'POST /api/v1/oci-configs/:id/users/:userId/reset-password': '重置用户密码',
'DELETE /api/v1/oci-configs/:id/users/:userId/mfa-devices': '移除用户 MFA',
'DELETE /api/v1/oci-configs/:id/users/:userId/api-keys': '清除用户 API Key',
'POST /api/v1/oci-configs/:id/log-webhook': '生成回传回调地址',
'DELETE /api/v1/oci-configs/:id/log-webhook': '撤销回传回调地址',
'POST /api/v1/oci-configs/:id/log-relay': '一键创建回传链路',
'DELETE /api/v1/oci-configs/:id/log-relay': '销毁回传链路',
'POST /api/v1/tasks': '创建后台任务',
'PUT /api/v1/tasks/:id': '修改后台任务',
'DELETE /api/v1/tasks/:id': '删除后台任务',
'POST /api/v1/tasks/:id/run': '手动执行任务',
'POST /api/v1/webhooks/oci-logs/:secret': '回传消息投递',
'POST /api/v1/ai-keys': '创建网关密钥',
'PUT /api/v1/ai-keys/:id': '修改网关密钥',
'DELETE /api/v1/ai-keys/:id': '删除网关密钥',
'PUT /api/v1/ai-keys/:id/content-log': '设置密钥内容留痕',
'POST /api/v1/ai-channels': '创建网关渠道',
'PUT /api/v1/ai-channels/:id': '修改网关渠道',
'DELETE /api/v1/ai-channels/:id': '删除网关渠道',
'POST /api/v1/ai-channels/:id/probe': '探测网关渠道',
'POST /api/v1/ai-channels/:id/sync-models': '同步渠道模型',
'POST /api/v1/ai-blacklist': '拉黑模型',
'DELETE /api/v1/ai-blacklist/:id': '移出模型黑名单',
'PUT /api/v1/ai-settings': '保存网关设置',
'PUT /api/v1/settings/notify-channels/:type': '保存通知渠道配置',
'POST /api/v1/settings/notify-channels/:type/test': '发送通知测试消息',
'PUT /api/v1/settings/notify-templates/:kind': '保存通知模板',
'POST /api/v1/settings/notify-templates/:kind/test': '发送模板测试消息',
'POST /api/v1/proxies/import': '批量导入代理',
'POST /api/v1/proxies/:id/probe': '探测代理',
'PUT /api/v1/proxies/:id/tenants': '设置代理关联租户',
}
/** 资源段兜底词典:精确表未命中时以「动词 + 资源」组合 */
const nouns: Record<string, string> = {
vcns: 'VCN',
subnets: '子网',
'security-lists': '安全列表',
'boot-volumes': '引导卷',
'boot-volume-attachments': '引导卷挂载',
'volume-attachments': '块卷挂载',
'console-sessions': '控制台会话',
'console-connections': '控制台连接',
'notification-recipients': '通知收件人',
'password-policies': '密码策略',
'identity-settings': '身份设置',
'identity-providers': '身份提供方',
'sign-on-exemptions': 'MFA 豁免',
proxies: '代理',
}
const verbs: Record<string, string> = { POST: '创建', PUT: '修改', DELETE: '删除' }
/** 取路径中最后一个可翻译的资源段(跳过 :param 与动作尾段) */
function lastNoun(path: string): string {
const segs = path.split('/').filter((s) => s && !s.startsWith(':'))
for (let i = segs.length - 1; i >= 0; i--) {
const zh = nouns[segs[i]]
if (zh) return zh
}
return ''
}
export function actionLabel(method: string, path: string): string {
const hit = exact[`${method} ${path}`]
if (hit) return hit
const noun = lastNoun(path)
if (noun) return `${verbs[method] ?? method}${noun}`
return ''
}