refactor: 合并多语言支持的显示名称字段,优化奖池手动爆发功能的返回数据结构,增强管理端权限控制
This commit is contained in:
@@ -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`。
|
||||
*/
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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
112
src/lib/admin-prd.ts
Normal 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;
|
||||
Reference in New Issue
Block a user