优化审计日志中文展示与动作筛选
补全动作/业务类型中文映射,表格与下拉按分组展示,系统任务操作人可读。
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
/** 审计日志动作 / 业务类型中文映射(展示用,存储仍为英文 code) */
|
||||
|
||||
export interface AuditOption {
|
||||
value: string
|
||||
label: string
|
||||
/** 筛选下拉分组 */
|
||||
group?: string
|
||||
/** 是否高风险操作 */
|
||||
highRisk?: boolean
|
||||
}
|
||||
|
||||
export const AUDIT_ACTION_OPTIONS: AuditOption[] = [
|
||||
// 用户
|
||||
{ value: 'admin_user.freeze', label: '冻结用户', group: '用户', highRisk: true },
|
||||
{ value: 'admin_user.unfreeze', label: '解冻用户', group: '用户' },
|
||||
{ value: 'admin_user.set_deposit_free_quota', label: '设置免押额度', group: '用户', highRisk: true },
|
||||
{ value: 'admin_user.manual_realname', label: '人工实名', group: '用户', highRisk: true },
|
||||
{ value: 'admin_user.revoke_realname', label: '撤销实名', group: '用户', highRisk: true },
|
||||
{ value: 'admin_user.wallet_adjust', label: '调整用户余额', group: '用户', highRisk: true },
|
||||
// 商品
|
||||
{ value: 'listing.admin_offline', label: '后台下架商品', group: '商品', highRisk: true },
|
||||
{ value: 'listing.mark_abnormal', label: '商品标记异常', group: '商品', highRisk: true },
|
||||
{ value: 'listing.transfer_owner', label: '转移商品所有权', group: '商品', highRisk: true },
|
||||
{ value: 'listing.adjust_review_price', label: '审核调价', group: '商品' },
|
||||
// 订单
|
||||
{ value: 'order.admin_close', label: '客服关闭订单', group: '订单', highRisk: true },
|
||||
{ value: 'order.admin_seal', label: '客服封存订单', group: '订单', highRisk: true },
|
||||
{ value: 'order.mark_abnormal', label: '订单标记异常', group: '订单', highRisk: true },
|
||||
{ value: 'order.reset_handoff', label: '重置交接流程', group: '订单' },
|
||||
{ value: 'order.reset_renter_confirm', label: '重置租客确认', group: '订单' },
|
||||
{ value: 'order.reset_checkout_confirm', label: '重置结账确认', group: '订单' },
|
||||
{ value: 'order.reset_return_overdue', label: '重置归还逾期', group: '订单' },
|
||||
{ value: 'order.deposit_hold', label: '押金暂扣', group: '订单', highRisk: true },
|
||||
{ value: 'order.deposit_release', label: '押金归还', group: '订单', highRisk: true },
|
||||
// 超时任务(system)
|
||||
{ value: 'order.timeout.pending_payment', label: '超时关闭待支付', group: '系统任务' },
|
||||
{ value: 'order.timeout.owner_submit', label: '超时号主提交交接', group: '系统任务' },
|
||||
{ value: 'order.timeout.renter_confirm', label: '超时租客确认收号', group: '系统任务' },
|
||||
{ value: 'order.timeout.return_overdue', label: '超时归还逾期', group: '系统任务' },
|
||||
{ value: 'order.timeout.owner_checkout_confirm', label: '超时号主确认结账', group: '系统任务' },
|
||||
{ value: 'chat.renter_retention.remove', label: '到期移除租客会话', group: '系统任务' },
|
||||
// 提号
|
||||
{ value: 'pickup_create', label: '创建提号', group: '提号' },
|
||||
{ value: 'pickup_complete', label: '完成提号结算', group: '提号', highRisk: true },
|
||||
{ value: 'pickup_cancel', label: '取消提号', group: '提号' },
|
||||
// 申诉
|
||||
{ value: 'dispute.arbitrate', label: '申诉仲裁', group: '申诉', highRisk: true },
|
||||
// 系统配置
|
||||
{ value: 'system_config.create', label: '创建系统配置', group: '系统配置', highRisk: true },
|
||||
{ value: 'system_config.update', label: '更新系统配置', group: '系统配置', highRisk: true },
|
||||
// 支付配置
|
||||
{ value: 'payment_config.create', label: '创建支付配置', group: '支付配置', highRisk: true },
|
||||
{ value: 'payment_config.update', label: '更新支付配置', group: '支付配置', highRisk: true },
|
||||
{ value: 'payment_config.delete', label: '删除支付配置', group: '支付配置', highRisk: true },
|
||||
{ value: 'payment_config.view_secret', label: '查看支付密钥', group: '支付配置', highRisk: true },
|
||||
{ value: 'payment_config.export', label: '导出支付配置', group: '支付配置', highRisk: true },
|
||||
{ value: 'payment_config.import', label: '导入支付配置', group: '支付配置', highRisk: true },
|
||||
]
|
||||
|
||||
export const AUDIT_BIZ_TYPE_OPTIONS: AuditOption[] = [
|
||||
{ value: 'user', label: '用户' },
|
||||
{ value: 'listing', label: '商品' },
|
||||
{ value: 'order', label: '订单' },
|
||||
{ value: 'dispute', label: '申诉' },
|
||||
{ value: 'system_config', label: '系统配置' },
|
||||
{ value: 'payment_config', label: '支付配置' },
|
||||
{ value: 'admin_pickup', label: '提号' },
|
||||
]
|
||||
|
||||
const actionLabelMap = Object.fromEntries(AUDIT_ACTION_OPTIONS.map(item => [item.value, item.label]))
|
||||
const bizTypeLabelMap = Object.fromEntries(AUDIT_BIZ_TYPE_OPTIONS.map(item => [item.value, item.label]))
|
||||
const highRiskActions = new Set(AUDIT_ACTION_OPTIONS.filter(item => item.highRisk).map(item => item.value))
|
||||
|
||||
/** 动作 code → 中文;未知 code 原样返回 */
|
||||
export function auditActionLabel(action: string | undefined | null): string {
|
||||
if (!action) return '-'
|
||||
return actionLabelMap[action] || action
|
||||
}
|
||||
|
||||
/** 业务类型 code → 中文 */
|
||||
export function auditBizTypeLabel(bizType: string | undefined | null): string {
|
||||
if (!bizType) return '-'
|
||||
return bizTypeLabelMap[bizType] || bizType
|
||||
}
|
||||
|
||||
export function isHighRiskAuditAction(action: string | undefined | null): boolean {
|
||||
if (!action) return false
|
||||
if (highRiskActions.has(action)) return true
|
||||
// 兜底:未登记但含敏感关键词
|
||||
return /freeze|delete|import|export|secret|wallet_adjust|seal|close|arbitrate|offline|abnormal/i.test(
|
||||
action
|
||||
)
|
||||
}
|
||||
|
||||
/** 表格标签颜色 */
|
||||
export function auditActionTagType(
|
||||
action: string | undefined | null
|
||||
): 'danger' | 'warning' | 'success' | 'info' {
|
||||
if (!action) return 'info'
|
||||
if (isHighRiskAuditAction(action)) return 'danger'
|
||||
if (action.startsWith('order.timeout') || action.startsWith('chat.')) return 'info'
|
||||
if (action.includes('create') || action.includes('update') || action.includes('reset')) {
|
||||
return 'warning'
|
||||
}
|
||||
if (action.includes('complete') || action.includes('release') || action.includes('unfreeze')) {
|
||||
return 'success'
|
||||
}
|
||||
return 'info'
|
||||
}
|
||||
|
||||
/** 按 group 分组,供 el-option-group 使用 */
|
||||
export function groupedAuditActionOptions(): Array<{ group: string; options: AuditOption[] }> {
|
||||
const map = new Map<string, AuditOption[]>()
|
||||
for (const item of AUDIT_ACTION_OPTIONS) {
|
||||
const group = item.group || '其他'
|
||||
if (!map.has(group)) map.set(group, [])
|
||||
map.get(group)!.push(item)
|
||||
}
|
||||
return Array.from(map.entries()).map(([group, options]) => ({ group, options }))
|
||||
}
|
||||
Reference in New Issue
Block a user