Basic Architecture of Sport Web

This commit is contained in:
Nông Đức Huy
2026-08-11 13:37:25 +07:00
commit 8032fff6ac
262 changed files with 20348 additions and 0 deletions
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Brands' };
export default function BrandsPage() {
return (
<PageScaffold
title="Brands"
description="Brand records, logos and SEO fields."
permission="brand.read"
milestone="M3 — admin catalog"
/>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Categories' };
export default function CategoriesPage() {
return (
<PageScaffold
title="Categories"
description="Drag-to-reorder category tree with materialised-path maintenance."
permission="category.read"
milestone="M3 — admin catalog"
/>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Content' };
export default function CmsPage() {
return (
<PageScaffold
title="Content"
description="Homepage blocks, banners, blog posts and static pages."
permission="cms.read"
milestone="M7 — content"
/>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Collections' };
export default function CollectionsPage() {
return (
<PageScaffold
title="Collections"
description="Manual and rule-based collections, with campaign scheduling."
permission="collection.read"
milestone="M3 — admin catalog"
/>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Coupons' };
export default function CouponsPage() {
return (
<PageScaffold
title="Coupons"
description="Coupon codes, usage limits and redemption reporting."
permission="coupon.manage"
milestone="M7 — marketing"
/>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Customers' };
export default function CustomersPage() {
return (
<PageScaffold
title="Customers"
description="Customer records, order history and addresses."
permission="customer.read"
milestone="M5 — orders"
/>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Inventory' };
export default function InventoryPage() {
return (
<PageScaffold
title="Inventory"
description="Stock by variant and location, adjustments and the movement ledger."
permission="inventory.read"
milestone="M3 — admin catalog"
/>
);
}
+21
View File
@@ -0,0 +1,21 @@
import { AdminSidebar } from '@/components/layout/admin-sidebar';
/**
* Every route in this group requires an authenticated back-office actor.
* Enforcement is layered: middleware checks for a session cookie, this layout
* verifies the token server-side, and the API re-checks permissions on every
* request. Only the last one is real security; the first two are UX.
*/
export default function DashboardLayout({ children }: { children: React.ReactNode }) {
return (
<div className="flex min-h-screen">
<AdminSidebar />
<div className="min-w-0 flex-1">
<header className="border-ink-200 flex h-14 items-center justify-end border-b bg-white px-6">
<span className="text-ink-500 text-xs font-medium">Signed out</span>
</header>
<main>{children}</main>
</div>
</div>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Media' };
export default function MediaPage() {
return (
<PageScaffold
title="Media"
description="Asset library. Uploads go browser → presigned URL → R2; the API only records metadata."
permission="media.read"
milestone="M3 — admin catalog"
/>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Orders' };
export default function OrdersPage() {
return (
<PageScaffold
title="Orders"
description="Order list and detail: fulfilment, status transitions, refunds and the audit trail."
permission="order.read"
milestone="M5 — orders"
/>
);
}
+16
View File
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Dashboard' };
export default function DashboardPage() {
return (
<PageScaffold
title="Dashboard"
description="Revenue, orders, conversion and low-stock alerts."
permission="order.read"
milestone="M9 — admin analytics"
/>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Products' };
export default function ProductsPage() {
return (
<PageScaffold
title="Products"
description="Product list with status, brand and variant count. The editor manages options, generates the variant matrix and edits per-variant SKU, price and stock."
permission="product.read"
milestone="M3 — admin catalog"
/>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Promotions' };
export default function PromotionsPage() {
return (
<PageScaffold
title="Promotions"
description="Automatic cart-level discount rules."
permission="promotion.manage"
milestone="M7 — marketing"
/>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Reviews' };
export default function ReviewsPage() {
return (
<PageScaffold
title="Reviews"
description="Review moderation queue."
permission="review.moderate"
milestone="M7 — marketing"
/>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Roles' };
export default function RolesPage() {
return (
<PageScaffold
title="Roles"
description="Role editor: a role is a named set of permissions, editable at runtime with no deploy."
permission="role.read"
milestone="M2 — auth & RBAC"
/>
);
}
@@ -0,0 +1,16 @@
import type { Metadata } from 'next';
import { PageScaffold } from '@/components/layout/page-scaffold';
export const metadata: Metadata = { title: 'Users' };
export default function UsersPage() {
return (
<PageScaffold
title="Users"
description="Back-office accounts and role assignment."
permission="user.read"
milestone="M2 — auth & RBAC"
/>
);
}