/* NBA球迷大全 独立详情页渲染(/team/1 /player/1 /game/1 /news/1 /person/1) */ const $ = (s) => document.querySelector(s); const esc = (s) => String(s ?? "").replace(/[&<>"']/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c])); const STATUS_CN = { scheduled: "未开始", live: "进行中", finished: "已结束" }; async function getJSON(url) { const r = await fetch(url); if (!r.ok) throw new Error("记录不存在或已删除"); return r.json(); } /* 交叉链接 */ const T = (id, name) => `${esc(name)}`; const P = (id, name) => `${esc(name)}`; const G = (id, text) => `${esc(text)}`; const N = (id, title) => `${esc(title)}`; const PER = (id, name) => `${esc(name)}`; /* ================= 球队 ================= */ function renderTeam(d) { const t = d.team; const standings = (d.standings || []).map((s) => `${esc(s.season)} ${esc(s.conference)}第${s.rank}名 · ${s.wins}-${s.losses}`).join(""); const roster = (d.roster || []).map((p) => `
${P(p.id, p.name)} #${p.number} · ${esc(p.position)} 本季场均 ${p.season.pts} 分 / ${p.season.reb} 板 / ${p.season.ast} 助
`).join("") || '
暂无球员数据
'; const games = (d.recent_games || []).map((g) => { const score = g.status === "finished" ? `${g.away_score} : ${g.home_score}` : "VS"; return `
${G(g.id, `${g.away_team} ${score} ${g.home_team}`)} ${esc(g.round_name)} · ${esc(g.game_time.slice(0, 16))} · ${STATUS_CN[g.status]}
`; }).join("") || '
暂无比赛
'; $("#crumb").innerHTML = `🏟️ 球队 / ${esc(t.name)}`; $("#detail-body").innerHTML = `
${esc(t.name)}
${esc(t.name_en)} · ${esc(t.city)} · ${esc(t.arena)} · 建队 ${t.founded} 年 · 总冠军 ×${t.champion_count}

📈 各赛季战绩

${standings || '暂无排名数据'}

📝 球队简介

${esc(t.intro || "暂无简介")}

🧑‍🏫 主教练

${esc(t.head_coach || "未知")}

⭐ 主要球员(本赛季场均)

${roster}

📅 近期比赛

${games}
`; } /* ================= 球员 ================= */ function renderPlayer(p) { const logs = (p.game_logs || []).map((g) => { const score = g.home_score !== null ? `${g.away_score} : ${g.home_score}` : "VS"; return `
${G(g.game_id, `${g.away_team} ${score} ${g.home_team}`)} ${esc(g.round_name)} · ${esc(g.game_time.slice(0, 10))} ${g.pts}分 ${g.reb}板 ${g.ast}助 ${g.stl}断 ${g.blk}帽 ${g.min}分钟
`; }).join("") || '
暂无比赛记录
'; $("#crumb").innerHTML = `⭐ 球员 / ${esc(p.name)}`; $("#detail-body").innerHTML = `
${esc(p.name)}
${esc(p.name_en || "")} · ${p.team ? T(p.team_id ?? 0, p.team) : "自由球员"} · ${esc(p.position)} · #${p.number} · ${esc(p.country)}

📋 基本信息

身高${p.height_cm} cm
体重${p.weight_kg} kg
选秀${esc(p.draft)}
年薪$${(p.salary_m / 100).toFixed(2)} 亿
本季场均${p.season.pts}分 ${p.season.reb}板 ${p.season.ast}助
本季防守${p.season.stl}断 ${p.season.blk}帽
生涯场均${p.career.pts}分 ${p.career.reb}板 ${p.career.ast}助
生涯场次${p.career.games} 场

🏅 主要荣誉

${esc(p.awards || "暂无")}

📝 球员简介

${esc(p.bio || "暂无")}

🏀 近期比赛记录

${logs}
`; } /* ================= 比赛 ================= */ function renderGame(g) { const finished = g.status === "finished"; const head = finished ? `
${T(g.home_team_id, g.home_team)} ${g.home_score} : ${g.away_score} ${T(g.away_team_id, g.away_team)}
` : `
${T(g.home_team_id, g.home_team)} VS ${T(g.away_team_id, g.away_team)}
`; const stats = (g.box_score || []).map((s) => ` ${esc(s.team_name)}${P(s.player_id, s.player_name)} ${s.points}${s.rebounds}${s.assists} ${s.steals}${s.blocks}${s.minutes}`).join(""); $("#crumb").innerHTML = `📅 比赛 / ${esc(g.round_name)}`; $("#detail-body").innerHTML = `
${esc(g.round_name)} · ${STATUS_CN[g.status]}
${head}
🕐 ${esc(g.game_time)} · ${esc(g.venue)} · ${esc(g.broadcast)}
${stats ? `

📊 球员技术统计

${stats}
球队球员得分篮板助攻抢断盖帽分钟
` : '

📊 球员技术统计

暂无统计
'}`; } /* ================= 新闻/百科 ================= */ function renderNews(n) { $("#crumb").innerHTML = `📰 ${n.kind === "wiki" ? "百科" : "新闻"} / ${esc(n.title)}`; $("#detail-body").innerHTML = `
${esc(n.title)}
🕐 ${esc(n.publish_time || "")} · ${esc(n.source || "")}${n.author ? " · " + esc(n.author) : ""} · ${n.kind === "wiki" ? "百科词条" : "新闻"}${n.tags ? " · " + esc(n.tags) : ""}

📄 正文

${esc(n.content || "")}
`; } /* ================= 人物 ================= */ function renderPerson(p) { $("#crumb").innerHTML = `👥 人物 / ${esc(p.name)}`; $("#detail-body").innerHTML = `
${esc(p.name)}
${esc(p.role_cn || p.role || "")} · ${esc(p.title || "")}${p.team_id ? " · " + T(p.team_id, p.team_name || "相关球队") : ""}

📝 人物简介

${esc(p.bio || "暂无")}

🏅 主要成就

${esc(p.achievements || "暂无")}
`; } /* ================= 路由 ================= */ const ROUTERS = { team: renderTeam, player: renderPlayer, game: renderGame, news: renderNews, person: renderPerson }; const APIS = { team: "/api/teams/", player: "/api/players/", game: "/api/games/", news: "/api/news/", person: "/api/persons/" }; (async function init() { const m = location.pathname.match(/^\/(team|player|game|news|person)\/(\d+)\/?$/); if (!m) { $("#detail-body").innerHTML = '
❌ 地址无效
'; return; } const [etype, eid] = [m[1], parseInt(m[2])]; try { const d = await getJSON(APIS[etype] + eid); ROUTERS[etype](d); } catch (e) { $("#detail-body").innerHTML = `
❌ ${esc(e.message)}

← 返回首页
`; } })();