feat(player/admin/api): 站内邮箱、在线状态、员工菜单权限与内容管理增强

API:
- 新增 player-messages 域:充值审核通过/拒绝、Banner/公告推广消息,支持多语言模板
- 新增 presence 域:Redis 心跳在线状态,管理端可查询在线玩家数
- User 表增加 visible_menus 字段;新增 player_messages 表及迁移
- 充值审核通过/拒绝时按系统配置自动写入玩家站内消息
- 管理端新增 GET /deposit-orders/pending-count、GET /presence/online-count
- 玩家端新增消息 CRUD、presence/ping、home 返回 inbox 开关配置
- 员工管理支持 visibleMenus 配置与删除保护(不能删自己/最后超管)
- SystemConfig 增加 inbox 功能开关及各类通知开关

Admin:
- 员工管理:按角色默认菜单 + 可勾选可见菜单项
- ManageLayout:按 visibleMenus 过滤侧栏;充值待审数量角标轮询
- Contents:富文本编辑器、图片字段组件重构
- DashboardPlayers:展示在线玩家数;AdminPlayerStatusCell 在线状态列
- 多页面 i18n 与权限细节调整

Player:
- 站内邮箱中心(InboxHub):消息列表/详情、未读角标、一键已读/删除
- 公告列表与详情页;走马灯可跳转详情
- 客服 Modal 改为 Panel,与邮箱 Hub 整合
- 充值状态轮询通知;presence 心跳;BetSlip 清空二次确认
- HomeView 今日赛事板块;FootballView 等体验优化

Shared: 新增 CANNOT_DELETE_SELF、STAFF_NOT_FOUND、MESSAGE_NOT_FOUND 等错误码
Docs: 玩家端缺失功能分析文档
Chore: 移除 .agents/skills 设计类 skill 文件
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-17 17:51:10 +08:00
parent e9a23de935
commit f9343b00af
105 changed files with 6960 additions and 7523 deletions

View File

@@ -8,6 +8,8 @@ export default {
load_failed: 'Gagal dimuat',
retry: 'Cuba lagi',
back_to_top: 'Kembali ke atas',
cancel: 'Batal',
confirm: 'Sahkan',
},
nav: {
home: 'Laman Utama',
@@ -18,7 +20,10 @@ export default {
},
home: {
hot_matches: 'Perlawanan popular',
hot_tab: 'Popular',
upcoming_tab: 'Terdekat',
no_matches: 'Tiada perlawanan',
upcoming_empty: 'Tiada perlawanan dalam 3 hari akan datang',
announcement_badge: 'Notis',
announcement_default:
'Selamat datang ke TheBet365 · Perlawanan bola sepak sedang berlangsung · Bertaruh secara bertanggungjawab',
@@ -27,6 +32,67 @@ export default {
banner_slide: 'Slaid {n}',
banner_fallback: 'Banner',
},
announcements: {
title: 'Pusat Pengumuman',
detail_title: 'Butiran Pengumuman',
empty: 'Tiada pengumuman',
not_found: 'Pengumuman tidak tersedia',
view_all: 'Lihat semua pengumuman',
type_notice: 'Notis',
type_ticker: 'Ticker',
type_banner: 'Banner',
related_link: 'Pautan berkaitan',
go_link: 'Pergi ke halaman',
open_link: 'Buka pautan',
back: 'Kembali',
},
search: {
placeholder: 'Cari pasukan atau liga',
no_results: 'Tiada perlawanan dijumpai',
results_count: '{count} perlawanan dijumpai',
hint: 'Masukkan pasukan atau liga untuk tapis di halaman Pertaruhan',
},
deposit_notify: {
approved_title: 'Deposit diluluskan',
rejected_title: 'Deposit ditolak',
view_history: 'Lihat sejarah deposit',
view_messages: 'Buka peti mesej',
dismiss: 'Tutup',
},
messages: {
title: 'Peti Mesej',
detail_title: 'Butiran Mesej',
empty: 'Tiada mesej',
not_found: 'Mesej tidak dijumpai',
view_all: 'Kembali ke peti mesej',
back: 'Kembali',
mark_all_read: 'Tanda semua dibaca',
load_more: 'Muat lagi',
delete: 'Padam',
delete_all: 'Padam semua',
delete_confirm: 'Padam mesej ini?',
delete_all_confirm: 'Padam semua mesej? Tindakan ini tidak boleh dibatalkan.',
banner_promo_view: 'Lihat promosi',
content_promo_view: 'Lihat butiran',
status_unread: 'Belum dibaca',
status_read: 'Dibaca',
deposit_approved_title: 'Deposit diluluskan',
deposit_rejected_title: 'Deposit ditolak',
deposit_approved_body: 'Pesanan {orderNo} diluluskan. Diminta {amount}, dikreditkan {approvedAmount}.',
deposit_rejected_body: 'Pesanan {orderNo} ({amount}) ditolak. {reason}',
reject_reason: 'Sebab penolakan',
no_reason: 'Tiada sebab diberikan',
view_recharge_history: 'Lihat sejarah deposit',
unread_badge: '{count} belum dibaca',
open_inbox: 'Buka peti mesej',
},
inbox_hub: {
title: 'Mesej & Sokongan',
tab_messages: 'Peti Mesej',
tab_support: 'Sokongan',
open: 'Buka mesej dan sokongan',
open_support: 'Buka sokongan',
},
history: {
league_default: 'Bola Sepak',
stake: 'Jumlah',
@@ -402,6 +468,11 @@ export default {
slip_currency: 'Amaun',
slip_min: 'Min',
slip_min_error: 'Jumlah minimum ialah {amount}',
odds_changed: 'Odds beberapa pilihan telah berubah. Terima untuk teruskan.',
odds_suspended: 'Beberapa pilihan digantung atau ditutup. Buang untuk teruskan.',
accept_changes_place: 'Terima perubahan & pertaruh',
odds_was: 'Asal',
odds_now: 'Baharu',
place_success: 'Pertaruhan berjaya',
place_failed: 'Pertaruhan gagal',
},