feat: WC2026 赛事 seed、生产上线初始化脚本与目录归档
重构 seed 为 WC2026 72 场小组赛与 48 强优胜盘;新增 production 模式仅保留 admin 与赛事示例;提供 prod-init-db 全量重置脚本;管理端 i18n 分包与赛事归档能力。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -6,6 +6,10 @@ import {
|
||||
} from '../stores/auth';
|
||||
|
||||
let hydratePromise: Promise<boolean> | null = null;
|
||||
let lastHydrateAt = 0;
|
||||
|
||||
/** 跨路由复用 /me 结果,减少菜单切换时的重复鉴权请求 */
|
||||
const HYDRATE_TTL_MS = 60_000;
|
||||
|
||||
function isStaffUserType(value: unknown): value is StaffUserType {
|
||||
return value === 'ADMIN' || value === 'AGENT';
|
||||
@@ -13,6 +17,7 @@ function isStaffUserType(value: unknown): value is StaffUserType {
|
||||
|
||||
export function resetStaffSessionHydration() {
|
||||
hydratePromise = null;
|
||||
lastHydrateAt = 0;
|
||||
}
|
||||
|
||||
function hasCompleteStaffUser(u: StaffUser | null | undefined): u is StaffUser {
|
||||
@@ -23,6 +28,13 @@ function hasCompleteStaffUser(u: StaffUser | null | undefined): u is StaffUser {
|
||||
export async function hydrateStaffSession(): Promise<boolean> {
|
||||
const auth = useAuthStore();
|
||||
if (!auth.token.value) return false;
|
||||
|
||||
const freshEnough =
|
||||
lastHydrateAt > 0 &&
|
||||
Date.now() - lastHydrateAt < HYDRATE_TTL_MS &&
|
||||
hasCompleteStaffUser(auth.user.value);
|
||||
if (freshEnough) return true;
|
||||
|
||||
if (hydratePromise) return hydratePromise;
|
||||
|
||||
hydratePromise = (async () => {
|
||||
@@ -51,6 +63,7 @@ export async function hydrateStaffSession(): Promise<boolean> {
|
||||
canManageSubAgents: raw.canManageSubAgents === true,
|
||||
inviteCode: raw.inviteCode ?? null,
|
||||
});
|
||||
lastHydrateAt = Date.now();
|
||||
return true;
|
||||
} catch (e: unknown) {
|
||||
const status = (e as { response?: { status?: number } })?.response?.status;
|
||||
|
||||
Reference in New Issue
Block a user