refactor: 合并多语言支持的显示名称字段,优化奖池手动爆发功能的返回数据结构,增强管理端权限控制

This commit is contained in:
2026-05-25 14:31:24 +08:00
parent 7d01e5c47e
commit ddedef824e
101 changed files with 3033 additions and 641 deletions

View File

@@ -23,6 +23,35 @@ function formatParts(date: Date, timeZone?: string): string {
return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
}
const WEEKDAY_KEYS = [
"sunday",
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday",
] as const;
export type AdminWeekdayKey = (typeof WEEKDAY_KEYS)[number];
export function adminWeekdayKeyForDate(date: Date = new Date()): AdminWeekdayKey {
return WEEKDAY_KEYS[date.getDay()] ?? "sunday";
}
/**
* 仪表盘顶栏日期:数字日期 + i18n 星期(避免 Intl 在 ne 等语言下回退到系统中文)。
*/
export function formatAdminCalendarToday(locale: AdminApiLocale, weekdayLabel: string): string {
const d = new Date();
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, "0");
const day = String(d.getDate()).padStart(2, "0");
const datePart = locale === "en" ? `${m}/${day}/${y}` : `${y}-${m}-${day}`;
return `${datePart} ${weekdayLabel}`;
}
/**
* 将接口返回的 ISO 时间串格式化为浏览器本地时区下的 `YYYY-MM-DD HH:mm:ss`。
*/

View File

@@ -29,6 +29,7 @@ const EXACT_ROUTES: Record<string, PageTitleSpec> = {
"/admin/jackpot": { ns: "jackpot", key: "configTitle" },
"/admin/risk/cap": { ns: "config", key: "nav.riskCapTitle" },
"/admin/login": { ns: "auth", key: "title" },
"/admin/account": { ns: "common", key: "accountSettings" },
};
type RoutePattern = {

View File

@@ -44,32 +44,10 @@ export function getAdminPlayTypesLoadPromise(
return inflightLoad;
}
function pickDisplayName(row: AdminPlayTypeRow, language: string): string | null {
const lang = language.split("-")[0]?.toLowerCase() ?? "zh";
if (lang === "en" && row.display_name_en?.trim()) {
return row.display_name_en.trim();
}
if (lang === "ne" && row.display_name_ne?.trim()) {
return row.display_name_ne.trim();
}
if (row.display_name_zh?.trim()) {
return row.display_name_zh.trim();
}
if (row.display_name_en?.trim()) {
return row.display_name_en.trim();
}
if (row.display_name_ne?.trim()) {
return row.display_name_ne.trim();
}
return null;
}
/** 按当前语言解析玩法显示名;无配置时回退 play_code */
/** 解析玩法显示名;无配置时回退 play_code */
export function resolveAdminPlayTypeDisplayName(
playCode: string | null | undefined,
language: string,
_language?: string,
row?: AdminPlayTypeRow,
): string {
if (playCode == null || playCode === "") {
@@ -81,13 +59,14 @@ export function resolveAdminPlayTypeDisplayName(
return playCode;
}
return pickDisplayName(resolved, language) ?? playCode;
const name = resolved.display_name?.trim();
return name ? name : playCode;
}
/** 表格展示:显示名 + 编码(与报表筛选一致) */
export function formatAdminPlayCodeLabel(
playCode: string | null | undefined,
language: string,
language?: string,
): string {
if (playCode == null || playCode === "") {
return "—";

112
src/lib/admin-prd.ts Normal file
View File

@@ -0,0 +1,112 @@
/** 与 Laravel {@see AdminAuthorizationRegistry} 中 `prd.*` slug 对齐 */
export const PRD_ADMIN_USER_MANAGE = "prd.admin_user.manage" as const;
export const PRD_ADMIN_ROLE_MANAGE = "prd.admin_role.manage" as const;
export const PRD_USERS_MANAGE = "prd.users.manage" as const;
export const PRD_USERS_VIEW_FINANCE = "prd.users.view_finance" as const;
export const PRD_USERS_VIEW_CS = "prd.users.view_cs" as const;
export const PRD_PLAYER_FREEZE_MANAGE = "prd.player_freeze.manage" as const;
export const PRD_CURRENCY_MANAGE = "prd.currency.manage" as const;
export const PRD_WALLET_RECONCILE_MANAGE = "prd.wallet_reconcile.manage" as const;
export const PRD_WALLET_RECONCILE_VIEW = "prd.wallet_reconcile.view" as const;
export const PRD_WALLET_RECONCILE_VIEW_CS = "prd.wallet_reconcile.view_cs" as const;
export const PRD_WALLET_ADJUST_MANAGE = "prd.wallet_adjust.manage" as const;
export const PRD_DRAW_RESULT_MANAGE = "prd.draw_result.manage" as const;
export const PRD_DRAW_RESULT_VIEW = "prd.draw_result.view" as const;
export const PRD_DRAW_REOPEN_MANAGE = "prd.draw_reopen.manage" as const;
export const PRD_PLAY_SWITCH_MANAGE = "prd.play_switch.manage" as const;
export const PRD_ODDS_MANAGE = "prd.odds.manage" as const;
export const PRD_REBATE_MANAGE = "prd.rebate.manage" as const;
export const PRD_REBATE_VIEW = "prd.rebate.view" as const;
export const PRD_RISK_CAP_MANAGE = "prd.risk_cap.manage" as const;
export const PRD_RISK_CAP_VIEW = "prd.risk_cap.view" as const;
export const PRD_JACKPOT_MANAGE = "prd.jackpot.manage" as const;
export const PRD_JACKPOT_VIEW = "prd.jackpot.view" as const;
/** 超管紧急手动爆池(产品文档 §5.13 */
export const PRD_JACKPOT_MANUAL_BURST = "prd.jackpot.manual_burst" as const;
export const PRD_PAYOUT_MANAGE = "prd.payout.manage" as const;
export const PRD_PAYOUT_REVIEW = "prd.payout.review" as const;
export const PRD_PAYOUT_VIEW = "prd.payout.view" as const;
export const PRD_AUDIT_VIEW = "prd.audit.view" as const;
export const PRD_DASHBOARD_VIEW = "prd.dashboard.view" as const;
export const PRD_REPORT_VIEW = "prd.report.view" as const;
export const PRD_REPORT_EXPORT = "prd.report.export" as const;
export const PRD_TICKETS_VIEW = "prd.tickets.view" as const;
export const PRD_RISK_VIEW = "prd.risk.view" as const;
export const PRD_RISK_MANAGE = "prd.risk.manage" as const;
export const PRD_ODDS_VIEW = "prd.odds.view" as const;
/** 钱包补单/冲正(冲正 + 手工处理) */
export const PRD_WALLET_WRITE_ANY = [
PRD_WALLET_ADJUST_MANAGE,
PRD_WALLET_RECONCILE_MANAGE,
] as const;
/** 玩家列表页(与侧栏 requiredAny 一致) */
export const PRD_PLAYERS_ACCESS_ANY = [
PRD_USERS_MANAGE,
PRD_USERS_VIEW_FINANCE,
PRD_USERS_VIEW_CS,
PRD_PLAYER_FREEZE_MANAGE,
] as const;
/** 注单列表页 */
export const PRD_TICKETS_ACCESS_ANY = [PRD_TICKETS_VIEW] as const;
/** 仪表盘 */
export const PRD_DASHBOARD_ACCESS_ANY = [PRD_DASHBOARD_VIEW] as const;
/** 风控中心(含期号内风控页) */
export const PRD_RISK_ACCESS_ANY = [
PRD_RISK_VIEW,
PRD_RISK_MANAGE,
PRD_DRAW_RESULT_VIEW,
PRD_DRAW_RESULT_MANAGE,
] as const;
/** 报表查看 / 导出 */
export const PRD_REPORTS_VIEW_ACCESS_ANY = [PRD_REPORT_VIEW] as const;
export const PRD_REPORTS_EXPORT_ACCESS_ANY = [PRD_REPORT_EXPORT] as const;
/** 钱包流水 */
export const PRD_WALLET_TX_ACCESS_ANY = [
PRD_WALLET_RECONCILE_MANAGE,
PRD_WALLET_RECONCILE_VIEW,
PRD_WALLET_RECONCILE_VIEW_CS,
] as const;
/** 转账订单 */
export const PRD_WALLET_TRANSFER_ACCESS_ANY = [
...PRD_WALLET_TX_ACCESS_ANY,
PRD_WALLET_ADJUST_MANAGE,
PRD_USERS_MANAGE,
PRD_USERS_VIEW_FINANCE,
] as const;
/** 单玩家钱包查询 */
export const PRD_WALLET_PLAYER_ACCESS_ANY = [
PRD_USERS_MANAGE,
PRD_USERS_VIEW_FINANCE,
...PRD_WALLET_TX_ACCESS_ANY,
] as const;
/** 赔率与回水配置页 */
export const PRD_RULES_ODDS_ACCESS_ANY = [
PRD_ODDS_MANAGE,
PRD_ODDS_VIEW,
PRD_REBATE_MANAGE,
PRD_REBATE_VIEW,
] as const;
/** 封顶配置页 */
export const PRD_RISK_CAP_ACCESS_ANY = [PRD_RISK_CAP_MANAGE, PRD_RISK_CAP_VIEW] as const;
/** Jackpot 配置页 */
export const PRD_JACKPOT_ACCESS_ANY = [PRD_JACKPOT_MANAGE, PRD_JACKPOT_VIEW] as const;