A modern, secure digital magazine platform built for educators worldwide. Features a responsive design, comprehensive admin dashboard, and robust content management system.
Before running this project, make sure you have:
```bash
git clone
```bash npm install ```
```bash
cp .env.example .env.local
nano .env.local # or use your preferred editor ```
```bash npm run dev ```
The application will be available at `http://localhost:3000`
``` ├── app/ # Next.js App Router pages │ ├── admin/ # Admin dashboard pages │ ├── articles/ # Article pages │ ├── categories/ # Category pages │ └── globals.css # Global styles ├── components/ # Reusable React components │ ├── admin/ # Admin-specific components │ └── ui/ # UI components (shadcn/ui) ├── lib/ # Utility functions and contexts ├── hooks/ # Custom React hooks ├── middleware.ts # Next.js middleware for security └── tailwind.config.ts # Tailwind CSS configuration ```
```bash
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt-get install -y nodejs
npm install -g pm2
git clone
pm2 start npm –name “educator-magazine” – start pm2 startup pm2 save ```
Create a `Dockerfile`: ```dockerfile FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build EXPOSE 3000 CMD [“npm”, “start”] ```
Build and run: ```bash docker build -t educator-magazine . docker run -p 3000:3000 educator-magazine ```
The website is fully responsive and optimized for:
Edit `tailwind.config.ts` to customize the warm color palette.
All content is managed through the admin dashboard at `/admin`.
The project uses Tailwind CSS with custom warm colors and shadcn/ui components.
lsof -ti:3000 | xargs kill -9 ```
rm -rf .next npm run build ```
For issues and questions:
This project is licensed under the MIT License. ```
Let’s update the site header to remove the subscription link:
```tsx file=”components/site-header.tsx” [v0-no-op-code-block-prefix]import Link from “next/link”
const navigation = [ { name: “About”, href: “/about” }, { name: “Contact”, href: “/contact” }, { name: “Articles”, href: “/articles” }, { name: “Admin”, href: “/admin” } ]
export default function SiteHeader() { return ( <header className="bg-white shadow"> <div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8"> <div className="flex h-16 justify-between"> <div className="flex"> <div className="flex flex-shrink-0 items-center"> My Blog </Link> </div> <div className="hidden sm:ml-6 sm:flex sm:space-x-8"> {navigation.map((item) => ( <Link key={item.name} href={item.href} className=”inline-flex items-center border-b-2 border-transparent px-1 pt-1 text-sm font-medium text-gray-500 hover:border-gray-300 hover:text-gray-700” > {item.name} </Link> ))} </div> </div> </div> </div> </header> ) }