feat: 管理端 RBAC 权限体系与员工管理
新增多角色权限控制(赛事/财务/客服管理员),支持员工 CRUD、路由菜单按权限显隐、审计日志范围过滤;登录返回角色与权限列表。玩家端赛事列表增加静默刷新避免图片闪烁。Seed 补充演示员工账号与充值相关权限。附带 RBAC/审计范围单元测试及 UAT 文档更新。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -27,6 +27,14 @@ const zh: Record<string, string> = {
|
||||
'login.quick_admin': '管理员',
|
||||
'login.quick_agent': '一级代理',
|
||||
'login.quick_agent2': '二级代理',
|
||||
'login.quick_match_admin': '赛事管理员',
|
||||
'login.quick_finance_admin': '财务管理员',
|
||||
'login.quick_support': '客服查询员',
|
||||
'staff.create_btn': '创建后台账号',
|
||||
'staff.col.role': '角色',
|
||||
'staff.col.last_login': '最近登录',
|
||||
'staff.dialog.create': '创建后台账号',
|
||||
'staff.dialog.edit': '编辑后台账号',
|
||||
'login.captcha_ph': '验证码',
|
||||
'login.captcha_refresh': '点击刷新',
|
||||
|
||||
@@ -50,6 +58,7 @@ const zh: Record<string, string> = {
|
||||
'nav.payment_methods': '收款方式',
|
||||
'nav.deposit_orders': '充值审核',
|
||||
'nav.deposit_manage': '充值管理',
|
||||
'nav.staff': '后台账号',
|
||||
'nav.players': '直属玩家',
|
||||
|
||||
'deposit.payment_methods_title': '收款方式管理',
|
||||
@@ -132,6 +141,10 @@ const zh: Record<string, string> = {
|
||||
'breadcrumb.match_markets': '盘口管理',
|
||||
'breadcrumb.outright_edit': '编辑优胜冠军',
|
||||
'role.admin': '系统管理员',
|
||||
'role.super_admin': '超级管理员',
|
||||
'role.match_admin': '赛事管理员',
|
||||
'role.finance_admin': '财务管理员',
|
||||
'role.support': '客服查询员',
|
||||
'role.agent': '代理账号',
|
||||
'role.tier1_agent': '一级代理',
|
||||
'role.tier2_agent': '二级代理',
|
||||
@@ -209,6 +222,8 @@ const zh: Record<string, string> = {
|
||||
'dash.user_direct': '直属',
|
||||
'dash.user_agents': '代理',
|
||||
'dash.section_matches_hint': '投注经营与赛事状态分布',
|
||||
'dash.section_match_ops_hint': '赛事状态与待办',
|
||||
'dash.trend_bet_count_caption': '近 7 日注单量趋势',
|
||||
'dash.section_players_hint': '玩家、代理与资金概况',
|
||||
'dash.kpi_match_total': '赛事总数',
|
||||
'dash.kpi_match_total_sub': '草稿 {draft} · 已发布 {published}',
|
||||
@@ -308,6 +323,14 @@ const en: Record<string, string> = {
|
||||
'login.quick_admin': 'Admin',
|
||||
'login.quick_agent': 'Tier-1 agent',
|
||||
'login.quick_agent2': 'Tier-2 agent',
|
||||
'login.quick_match_admin': 'Match admin',
|
||||
'login.quick_finance_admin': 'Finance admin',
|
||||
'login.quick_support': 'Support',
|
||||
'staff.create_btn': 'Create staff account',
|
||||
'staff.col.role': 'Role',
|
||||
'staff.col.last_login': 'Last login',
|
||||
'staff.dialog.create': 'Create staff account',
|
||||
'staff.dialog.edit': 'Edit staff account',
|
||||
'login.captcha_ph': 'Captcha',
|
||||
'login.captcha_refresh': 'Click to refresh',
|
||||
|
||||
@@ -331,6 +354,7 @@ const en: Record<string, string> = {
|
||||
'nav.payment_methods': 'Payment Methods',
|
||||
'nav.deposit_orders': 'Deposit Review',
|
||||
'nav.deposit_manage': 'Deposit Mgmt',
|
||||
'nav.staff': 'Staff accounts',
|
||||
'nav.players': 'My Players',
|
||||
'nav.subAgents': 'Tier-2 agents',
|
||||
'nav.myBets': 'Bet Search',
|
||||
@@ -413,6 +437,10 @@ const en: Record<string, string> = {
|
||||
'breadcrumb.match_markets': 'Markets',
|
||||
'breadcrumb.outright_edit': 'Edit outright',
|
||||
'role.admin': 'Administrator',
|
||||
'role.super_admin': 'Super admin',
|
||||
'role.match_admin': 'Match admin',
|
||||
'role.finance_admin': 'Finance admin',
|
||||
'role.support': 'Support',
|
||||
'role.agent': 'Agent',
|
||||
'role.tier1_agent': 'Tier-1 Agent',
|
||||
'role.tier2_agent': 'Tier-2 Agent',
|
||||
@@ -490,6 +518,8 @@ const en: Record<string, string> = {
|
||||
'dash.user_direct': 'Direct',
|
||||
'dash.user_agents': 'Agents',
|
||||
'dash.section_matches_hint': 'Betting performance and match distribution',
|
||||
'dash.section_match_ops_hint': 'Match status and pending work',
|
||||
'dash.trend_bet_count_caption': '7-day bet volume trend',
|
||||
'dash.section_players_hint': 'Players, agents, and wallet summary',
|
||||
'dash.kpi_match_total': 'Total matches',
|
||||
'dash.kpi_match_total_sub': 'Draft {draft} · Published {published}',
|
||||
@@ -589,6 +619,14 @@ const ms: Record<string, string> = {
|
||||
'login.quick_admin': 'Admin',
|
||||
'login.quick_agent': 'Ejen peringkat 1',
|
||||
'login.quick_agent2': 'Ejen peringkat 2',
|
||||
'login.quick_match_admin': 'Pentadbir perlawanan',
|
||||
'login.quick_finance_admin': 'Pentadbir kewangan',
|
||||
'login.quick_support': 'Sokongan',
|
||||
'staff.create_btn': 'Cipta akaun kakitangan',
|
||||
'staff.col.role': 'Peranan',
|
||||
'staff.col.last_login': 'Log masuk terakhir',
|
||||
'staff.dialog.create': 'Cipta akaun kakitangan',
|
||||
'staff.dialog.edit': 'Edit akaun kakitangan',
|
||||
'login.captcha_ph': 'Captcha',
|
||||
'login.captcha_refresh': 'Klik untuk muat semula',
|
||||
|
||||
@@ -612,6 +650,7 @@ const ms: Record<string, string> = {
|
||||
'nav.payment_methods': 'Kaedah Pembayaran',
|
||||
'nav.deposit_orders': 'Semakan Deposit',
|
||||
'nav.deposit_manage': 'Urus Deposit',
|
||||
'nav.staff': 'Akaun kakitangan',
|
||||
'nav.players': 'Pemain saya',
|
||||
'nav.subAgents': 'Ejen peringkat 2',
|
||||
'nav.myBets': 'Carian pertaruhan',
|
||||
@@ -694,6 +733,10 @@ const ms: Record<string, string> = {
|
||||
'breadcrumb.match_markets': 'Pasaran',
|
||||
'breadcrumb.outright_edit': 'Edit juara',
|
||||
'role.admin': 'Pentadbir',
|
||||
'role.super_admin': 'Super pentadbir',
|
||||
'role.match_admin': 'Pentadbir perlawanan',
|
||||
'role.finance_admin': 'Pentadbir kewangan',
|
||||
'role.support': 'Sokongan',
|
||||
'role.agent': 'Ejen',
|
||||
'role.tier1_agent': 'Ejen Peringkat 1',
|
||||
'role.tier2_agent': 'Ejen Peringkat 2',
|
||||
@@ -771,6 +814,8 @@ const ms: Record<string, string> = {
|
||||
'dash.user_direct': 'Terus',
|
||||
'dash.user_agents': 'Ejen',
|
||||
'dash.section_matches_hint': 'Prestasi pertaruhan dan taburan perlawanan',
|
||||
'dash.section_match_ops_hint': 'Status perlawanan dan tugasan',
|
||||
'dash.trend_bet_count_caption': 'Trend bilangan pertaruhan 7 hari',
|
||||
'dash.section_players_hint': 'Pemain, ejen, dan ringkasan dana',
|
||||
'dash.kpi_match_total': 'Jumlah perlawanan',
|
||||
'dash.kpi_match_total_sub': 'Draf {draft} · Diterbitkan {published}',
|
||||
|
||||
@@ -333,28 +333,42 @@ export const adminPagesMs: Record<string, string> = {
|
||||
'bet.col.result': 'Keputusan',
|
||||
|
||||
'audit.module_ph': 'cth. USERS, AGENTS',
|
||||
'audit.col.time': 'Masa',
|
||||
'audit.col.operator': 'Pengendali',
|
||||
'audit.col.action': 'Tindakan',
|
||||
'audit.col.module': 'Modul',
|
||||
'audit.col.target_id': 'ID sasaran',
|
||||
'audit.col.time': 'Masa',
|
||||
'audit.col.ip': 'IP',
|
||||
'audit.operator_system': 'Sistem',
|
||||
'audit.operator_player': 'Pemain',
|
||||
'audit.action.CREATE_PLAYER': 'Cipta pemain',
|
||||
'audit.action.UPDATE_PLAYER': 'Kemas kini pemain',
|
||||
'audit.action.DELETE_PLAYER': 'Padam pemain',
|
||||
'audit.action.RESET_PLAYER_PASSWORD': 'Set semula kata laluan pemain',
|
||||
'audit.action.RESET_DATABASE': 'Set semula pangkalan data',
|
||||
'audit.action.CREATE_AGENT': 'Cipta ejen',
|
||||
'audit.action.UPDATE_AGENT': 'Kemas kini ejen',
|
||||
'audit.action.UPDATE_PLAYER_ACCOUNT_SETTINGS': 'Kemas kini tetapan akaun pemain',
|
||||
'audit.action.UPDATE_AGENT_SUSPEND_SETTINGS': 'Kemas kini tetapan penggantungan ejen',
|
||||
'audit.action.UPDATE_AGENT_HIERARCHY_SETTINGS': 'Kemas kini tetapan hierarki ejen',
|
||||
'audit.action.UPDATE_BETTING_LIMITS': 'Kemas kini had pertaruhan',
|
||||
'audit.action.CONFIRM_SETTLEMENT': 'Sahkan penyelesaian',
|
||||
'audit.action.CONFIRM_RESETTLE': 'Sahkan penyelesaian semula',
|
||||
'audit.action.CONFIRM_CASHBACK': 'Sahkan bayaran rebat',
|
||||
'audit.action.CANCEL_CASHBACK': 'Batalkan kelompok rebat',
|
||||
'audit.action.CREATE_STAFF': 'Cipta kakitangan',
|
||||
'audit.action.UPDATE_STAFF': 'Kemas kini kakitangan',
|
||||
'audit.action.PURGE_UNUSED_FILES': 'Padam media tidak digunakan',
|
||||
'audit.action.FORGOT_PASSWORD_RESET': 'Pemain set semula kata laluan',
|
||||
'audit.module.USERS': 'Pemain',
|
||||
'audit.module.AGENTS': 'Ejen',
|
||||
'audit.module.SYSTEM': 'Sistem',
|
||||
'audit.module.SETTINGS': 'Tetapan',
|
||||
'audit.module.SETTLEMENT': 'Penyelesaian',
|
||||
'audit.module.CASHBACK': 'Rebat',
|
||||
'audit.module.STAFF': 'Kakitangan',
|
||||
'audit.module.MEDIA': 'Media',
|
||||
'audit.module.identity': 'Identiti',
|
||||
|
||||
'cashback.start_date': 'Tarikh mula',
|
||||
'cashback.end_date': 'Tarikh tamat',
|
||||
|
||||
@@ -355,28 +355,42 @@ export const adminPagesZh: Record<string, string> = {
|
||||
'bet.col.result': '赛果',
|
||||
|
||||
'audit.module_ph': '如 USERS、AGENTS',
|
||||
'audit.col.time': '时间',
|
||||
'audit.col.operator': '操作人',
|
||||
'audit.col.action': '操作',
|
||||
'audit.col.module': '模块',
|
||||
'audit.col.target_id': '目标 ID',
|
||||
'audit.col.time': '时间',
|
||||
'audit.col.ip': 'IP',
|
||||
'audit.operator_system': '系统',
|
||||
'audit.operator_player': '玩家',
|
||||
'audit.action.CREATE_PLAYER': '新建玩家',
|
||||
'audit.action.UPDATE_PLAYER': '更新玩家',
|
||||
'audit.action.DELETE_PLAYER': '删除玩家',
|
||||
'audit.action.RESET_PLAYER_PASSWORD': '重置玩家密码',
|
||||
'audit.action.RESET_DATABASE': '重置数据库',
|
||||
'audit.action.CREATE_AGENT': '新建代理',
|
||||
'audit.action.UPDATE_AGENT': '更新代理',
|
||||
'audit.action.UPDATE_PLAYER_ACCOUNT_SETTINGS': '更新玩家账号设置',
|
||||
'audit.action.UPDATE_AGENT_SUSPEND_SETTINGS': '更新代理停押设置',
|
||||
'audit.action.UPDATE_AGENT_HIERARCHY_SETTINGS': '更新代理层级设置',
|
||||
'audit.action.UPDATE_BETTING_LIMITS': '更新投注限额',
|
||||
'audit.action.CONFIRM_SETTLEMENT': '确认结算',
|
||||
'audit.action.CONFIRM_RESETTLE': '确认重结算',
|
||||
'audit.action.CONFIRM_CASHBACK': '确认发放返水',
|
||||
'audit.action.CANCEL_CASHBACK': '作废返水批次',
|
||||
'audit.action.CREATE_STAFF': '新建后台员工',
|
||||
'audit.action.UPDATE_STAFF': '更新后台员工',
|
||||
'audit.action.PURGE_UNUSED_FILES': '清理未引用媒体',
|
||||
'audit.action.FORGOT_PASSWORD_RESET': '玩家找回密码',
|
||||
'audit.module.USERS': '玩家',
|
||||
'audit.module.AGENTS': '代理',
|
||||
'audit.module.SYSTEM': '系统',
|
||||
'audit.module.SETTINGS': '系统设置',
|
||||
'audit.module.SETTLEMENT': '结算',
|
||||
'audit.module.CASHBACK': '返水',
|
||||
'audit.module.STAFF': '员工管理',
|
||||
'audit.module.MEDIA': '媒体库',
|
||||
'audit.module.identity': '身份认证',
|
||||
|
||||
'cashback.start_date': '开始日期',
|
||||
'cashback.end_date': '结束日期',
|
||||
@@ -1380,28 +1394,42 @@ export const adminPagesEn: Record<string, string> = {
|
||||
'bet.col.result': 'Result',
|
||||
|
||||
'audit.module_ph': 'e.g. USERS, AGENTS',
|
||||
'audit.col.time': 'Time',
|
||||
'audit.col.operator': 'Operator',
|
||||
'audit.col.action': 'Action',
|
||||
'audit.col.module': 'Module',
|
||||
'audit.col.target_id': 'Target ID',
|
||||
'audit.col.time': 'Time',
|
||||
'audit.col.ip': 'IP',
|
||||
'audit.operator_system': 'System',
|
||||
'audit.operator_player': 'Player',
|
||||
'audit.action.CREATE_PLAYER': 'Create player',
|
||||
'audit.action.UPDATE_PLAYER': 'Update player',
|
||||
'audit.action.DELETE_PLAYER': 'Delete player',
|
||||
'audit.action.RESET_PLAYER_PASSWORD': 'Reset player password',
|
||||
'audit.action.RESET_DATABASE': 'Reset database',
|
||||
'audit.action.CREATE_AGENT': 'Create agent',
|
||||
'audit.action.UPDATE_AGENT': 'Update agent',
|
||||
'audit.action.UPDATE_PLAYER_ACCOUNT_SETTINGS': 'Update player account settings',
|
||||
'audit.action.UPDATE_AGENT_SUSPEND_SETTINGS': 'Update agent suspend settings',
|
||||
'audit.action.UPDATE_AGENT_HIERARCHY_SETTINGS': 'Update agent hierarchy settings',
|
||||
'audit.action.UPDATE_BETTING_LIMITS': 'Update betting limits',
|
||||
'audit.action.CONFIRM_SETTLEMENT': 'Confirm settlement',
|
||||
'audit.action.CONFIRM_RESETTLE': 'Confirm resettlement',
|
||||
'audit.action.CONFIRM_CASHBACK': 'Confirm cashback payout',
|
||||
'audit.action.CANCEL_CASHBACK': 'Cancel cashback batch',
|
||||
'audit.action.CREATE_STAFF': 'Create staff account',
|
||||
'audit.action.UPDATE_STAFF': 'Update staff account',
|
||||
'audit.action.PURGE_UNUSED_FILES': 'Purge unused media',
|
||||
'audit.action.FORGOT_PASSWORD_RESET': 'Player forgot-password reset',
|
||||
'audit.module.USERS': 'Players',
|
||||
'audit.module.AGENTS': 'Agents',
|
||||
'audit.module.SYSTEM': 'System',
|
||||
'audit.module.SETTINGS': 'Settings',
|
||||
'audit.module.SETTLEMENT': 'Settlement',
|
||||
'audit.module.CASHBACK': 'Cashback',
|
||||
'audit.module.STAFF': 'Staff',
|
||||
'audit.module.MEDIA': 'Media',
|
||||
'audit.module.identity': 'Identity',
|
||||
|
||||
'cashback.start_date': 'Start date',
|
||||
'cashback.end_date': 'End date',
|
||||
|
||||
Reference in New Issue
Block a user