/* 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 ? `` : ''}`;
}
/* ================= 新闻/百科 ================= */
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 = ``;
}
})();