feat(web): split video and up rankings and add about page
This commit is contained in:
1 parent
5a656d42a8
commit
c0b0286395
9 files changed
+298
-98
No files matched your search
@@ -4,25 +4,31 @@ import { onRoute, parseLocation, startRouter } from "./router.js";
|
||||
import { renderCandidates } from "./views/candidates.js";
|
||||
import { renderFans } from "./views/fans.js";
|
||||
import { renderHome } from "./views/home.js";
|
||||
import { renderRankings } from "./views/rankings.js";
|
||||
import { renderUps, renderVideos } from "./views/rankings.js";
|
||||
import { renderSystem } from "./views/system.js";
|
||||
import { renderUp } from "./views/up.js";
|
||||
import { renderVideo } from "./views/video.js";
|
||||
import { renderAbout } from "./views/about.js";
|
||||
|
||||
const NAV_ITEMS = [
|
||||
{ path: "/home", label: "首页", icon: "home" },
|
||||
{ path: "/rank", label: "榜单", icon: "rank" },
|
||||
{ path: "/videos", label: "视频", icon: "video" },
|
||||
{ path: "/ups", label: "UP主", icon: "up" },
|
||||
{ path: "/fans", label: "粉丝", icon: "fans" },
|
||||
{ path: "/candidates", label: "候选", icon: "candidate", protected: true },
|
||||
{ path: "/system", label: "系统", icon: "system", protected: true },
|
||||
{ path: "/about", label: "说明", icon: "info" },
|
||||
];
|
||||
|
||||
const ROUTES = [
|
||||
{ pattern: /^\/home$/, view: renderHome, title: "最新动态" },
|
||||
{ pattern: /^\/rank$/, view: renderRankings, title: "榜单" },
|
||||
{ pattern: /^\/videos$/, view: renderVideos, title: "视频" },
|
||||
{ pattern: /^\/ups$/, view: renderUps, title: "UP主" },
|
||||
{ pattern: /^\/rank$/, view: renderLegacyRank, title: "榜单" },
|
||||
{ pattern: /^\/video\/(\d+)$/, view: renderVideo, title: "视频详情" },
|
||||
{ pattern: /^\/up\/(\d+)$/, view: renderUp, title: "UP 详情" },
|
||||
{ pattern: /^\/fans$/, view: renderFans, title: "粉丝" },
|
||||
{ pattern: /^\/about$/, view: renderAbout, title: "数据说明" },
|
||||
{
|
||||
pattern: /^\/candidates$/, view: renderCandidates, title: "候选池",
|
||||
beforeEnter: requireAuth,
|
||||
@@ -33,6 +39,13 @@ const ROUTES = [
|
||||
},
|
||||
];
|
||||
|
||||
function renderLegacyRank(root, context) {
|
||||
// 旧链接 /rank?scope=up 仍可用,但不再在页面内混排视频与 UP。
|
||||
return context.query.get("scope") === "up"
|
||||
? renderUps(root, context)
|
||||
: renderVideos(root, context);
|
||||
}
|
||||
|
||||
let authState = { authEnabled: false, authenticated: true };
|
||||
|
||||
function canAccessProtected() {
|
||||
@@ -53,9 +66,12 @@ function icon(name) {
|
||||
const paths = {
|
||||
home: '<path d="M4 10.5 12 4l8 6.5V20a1 1 0 0 1-1 1h-5v-6H10v6H5a1 1 0 0 1-1-1z"/>',
|
||||
rank: '<path d="M5 20V10m7 10V4m7 16v-7"/>',
|
||||
video: '<rect x="3" y="5" width="18" height="14" rx="3"/><path d="m10 9 5 3-5 3z"/>',
|
||||
up: '<circle cx="12" cy="8" r="3"/><path d="M5 21a7 7 0 0 1 14 0"/><path d="m18.5 5 .6 1.2 1.4.2-1 1 .2 1.4-1.2-.6-1.2.6.2-1.4-1-1 1.4-.2z"/>',
|
||||
fans: '<path d="M16 20v-1a4 4 0 0 0-4-4H7a4 4 0 0 0-4 4v1"/><circle cx="9.5" cy="7" r="3"/><path d="M17 11a3 3 0 1 0 0-6m1 15v-1a4 4 0 0 0-3-3.8"/>',
|
||||
candidate: '<path d="M9 11l2 2 4-4"/><rect x="4" y="4" width="16" height="16" rx="3"/>',
|
||||
system: '<circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.9-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.6 1.7 1.7 0 0 0-1.9.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.9 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.6-1 1.7 1.7 0 0 0-.3-1.9l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.9.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.9-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.9V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z"/>',
|
||||
info: '<circle cx="12" cy="12" r="9"/><path d="M12 11v5"/><circle cx="12" cy="7.5" r="1"/>',
|
||||
};
|
||||
return `<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
|
||||
stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${paths[name] || ""}</svg>`;
|
||||
@@ -74,10 +90,12 @@ function renderNav() {
|
||||
|
||||
function activeNav(path) {
|
||||
let active = "/home";
|
||||
if (path.startsWith("/rank") || path.startsWith("/video/") || path.startsWith("/up/")) active = "/rank";
|
||||
if (path.startsWith("/videos") || path.startsWith("/video/") || path.startsWith("/rank")) active = "/videos";
|
||||
else if (path.startsWith("/ups") || path.startsWith("/up/")) active = "/ups";
|
||||
else if (path.startsWith("/fans")) active = "/fans";
|
||||
else if (path.startsWith("/candidates")) active = "/candidates";
|
||||
else if (path.startsWith("/system")) active = "/system";
|
||||
else if (path.startsWith("/about")) active = "/about";
|
||||
document.querySelectorAll("[data-nav]").forEach((item) => {
|
||||
item.classList.toggle("active", item.dataset.nav === active);
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user