ساخت فروشگاه تجارت الکترونیک با NextJS

در این آموزش، نحوه ایجاد یک فروشگاه تجارت الکترونیکی را خواهید آموخت که در آن مشتریان می توانند محصولات را خریداری کرده و از طریق Stripe پرداخت کنند. پس از پرداخت موفقیت آمیز، یک اعلان ایمیل برای مشتری و یک اعلان درون برنامه ای برای کاربر Admin ارسال می شود. کاربر Admin همچنین می تواند محصولات را در برنامه ایجاد و حذف کند.
برای ساخت این اپلیکیشن از ابزارهای زیر استفاده خواهیم کرد:
-
Appwrite – برای احراز هویت کاربران و همچنین ذخیره و بازیابی جزئیات محصول.
-
Next.js – برای ایجاد رابط کاربری و باطن برنامه.
-
Novu – برای ارسال ایمیل و اعلان های درون برنامه ای.
-
React Email – برای ایجاد الگوهای ایمیل.
-
Stripe – برای ادغام پرداخت پرداخت با برنامه.
ساخت رابط برنامه با Next.js
صفحات اپلیکیشن بر اساس نقش هایی که به کاربران اختصاص داده می شود به دو قسمت تقسیم می شوند. مشتریان می توانند قبل از پرداخت به صفحه اصلی دسترسی داشته باشند و به برنامه وارد شوند. کاربران ادمین می توانند به همه صفحات از جمله صفحه ورود به سیستم و صفحه داشبورد دسترسی داشته باشند که در آن می توانند محصولات را اضافه و حذف کنند.
حالا بیایید اپلیکیشن را بسازیم.
با اجرای قطعه کد زیر یک پروژه Next.js Typescript جدید ایجاد کنید:
npx create-next-app novu-store
در مرحله بعد React Icons و بسته Headless UI را نصب کنید. React Icons به ما اجازه می دهد تا از نمادهای مختلف در برنامه استفاده کنیم، در حالی که UI Headless اجزای رابط کاربری مدرن با استفاده آسان را ارائه می دهد.
npm install react-icons @headlessui/react
این قطعه کد را از مخزن GitHub در کپی کنید app/page.tsx
فایل. لیستی از محصولات را بر روی صفحه نمایش می دهد و به کاربران امکان می دهد مواردی را در یک سبد خرید مانند تصویر زیر انتخاب کنند.
یک مسیر ورود به سیستم ایجاد کنید که به کاربران امکان می دهد با استفاده از حساب GitHub خود ثبت نام کنند. قطعه کد زیر را در قسمت کپی کنید app/login/page.tsx
فایل.
//👉🏻 create a login folder containing a page.tsx file
export default function Home() {
const handleGoogleSignIn = async () => {};
return (
<main className='w-full min-h-screen flex flex-col items-center justify-center'>
<h2 className='font-semibold text-3xl mb-2'>Customer Sign inh2>
<p className='mb-4 text-sm text-red-500'>
You need to sign in before you can make a purchase
p>
<button
className='p-4 border-[2px] border-gray-500 rounded-md hover:bg-black hover:text-white w-2/3'
onClick={() => handleGoogleSignIn()}
>
Sign in with GitHub
button>
main>
);
}
هنگامی که کاربران روی دکمه ورود کلیک می کنند، آنها را به صفحه احراز هویت GitHub هدایت می کند و از آنها می خواهد که وارد برنامه شوند. به زودی نحوه انجام این کار را با Appwrite خواهید آموخت.
در مرحله بعد، بیایید صفحات مدیریت را ایجاد کنیم. یک را اضافه کنید admin
پوشه حاوی الف login
و dashboard
مسیر در داخل app
پوشه
cd app
mkdir admin && cd admin
mkdir dashboard login
a اضافه کنید page.tsx
فایل در داخل dashboard
و login
پوشه ها، و قطعه کد زیر را در قسمت کپی کنید login/page.tsx
فایل.
"use client";
import Link from "next/link";
import { useState } from "react";
export default function Login() {
const [email, setEmail] = useState<string>("");
const [password, setPassword] = useState<string>("");
const handleLogin = async (e: React.FormEvent) => {
e.preventDefault();
console.log({ email, password });
};
return (
<main className='w-full min-h-screen flex flex-col items-center justify-center'>
<h2 className='font-semibold text-3xl mb-4'> Admin Sign inh2>
<form className='w-2/3' onSubmit={handleLogin}>
<label htmlFor='email' className='block'>
Email
label>
<input
type='email'
id='email'
className='w-full px-4 py-3 border border-gray-400 rounded-sm mb-4'
required
value={email}
placeholder='admin@admin.com'
onChange={(e) => setEmail(e.target.value)}
/>
<label htmlFor='password' className='block'>
Password
label>
<input
type='password'
id='password'
className='w-full px-4 py-3 border border-gray-400 rounded-sm mb-4'
required
value={password}
placeholder='admin123'
onChange={(e) => setPassword(e.target.value)}
/>
<button className='p-4 text-lg mb-3 bg-blue-600 text-white w-full rounded-md'>
Sign in
button>
<p className='text-sm text-center'>
Not an Admin?{" "}
<Link href='/login' className='text-blue-500'>
Sign in as a Customer
Link>
p>
form>
main>
);
}
قطعه کد بالا فرمی را ارائه می دهد که ایمیل و رمز عبور مدیر را می پذیرد، اعتبارنامه ها را تأیید می کند و سپس کاربر را وارد برنامه می کند.
صفحه داشبورد Admin محصولات موجود را ارائه می دهد و به کاربر Admin اجازه می دهد تا محصولات را از برنامه اضافه و حذف کند. این قطعه کد را در قسمت کپی کنید dashboard/page.tsx
فایل برای ایجاد رابط کاربری
تبریک می گویم! شما رابط برنامه را ساخته اید. در بخشهای آتی، نحوه اتصال برنامه به پشتیبان Appwrite و ارسال دادهها بین مشتری و سرور را خواهید آموخت.
چگونه Appwrite را به برنامه Next.js اضافه کنیم
Appwrite یک سرویس باطن منبع باز است که به شما امکان می دهد برنامه های نرم افزاری ایمن و مقیاس پذیر ایجاد کنید. ویژگیهایی مانند روشهای احراز هویت چندگانه، پایگاه داده ایمن، ذخیرهسازی فایل، پیامرسانی ابری و موارد دیگر را ارائه میدهد که برای ساخت برنامههای فول استک ضروری هستند.
در این بخش، نحوه راه اندازی یک پروژه Appwrite شامل ویژگی هایی مانند احراز هویت، پایگاه داده و ذخیره سازی فایل را یاد خواهید گرفت.
ابتدا از Appwrite Cloud دیدن کنید و یک حساب کاربری و سازمان برای پروژه های خود ایجاد کنید.
بعد، یک پروژه جدید ایجاد کنید و منطقه مورد نظر خود را برای میزبانی پروژه انتخاب کنید.
انتخاب کنید Web
به عنوان پلتفرم SDK برای برنامه.
مراحل نمایش داده شده روی صفحه را دنبال کنید. از آنجایی که در حال حاضر در حال ساخت در حالت توسعه هستید، می توانید از علامت عام استفاده کنید (*
) به عنوان نام میزبان خود و پس از استقرار برنامه آن را به نام دامنه خود تغییر دهید.
Appwrite Client SDK را در پروژه Next.js خود نصب کنید.
npm install appwrite
در نهایت، یک را ایجاد کنید appwrite.ts
در پوشه برنامه Next.js خود فایل کنید و قطعه کد زیر را در فایل کپی کنید تا Appwrite مقداردهی اولیه شود.
import { Client, Account, Databases, Storage } from "appwrite";
const client = new Client();
client
.setEndpoint("https://cloud.appwrite.io/v1")
.setProject(<YOUR_PROJECT_ID>);
export const account = new Account(client);
export const db = new Databases(client);
export const storage = new Storage(client);
راه اندازی GitHub Authentication با Appwrite
در اینجا، نحوه تنظیم GitHub و احراز هویت ایمیل/گذرواژه را با Appwrite خواهید آموخت. احراز هویت ایمیل/گذرواژه قبلاً بهطور پیشفرض پیکربندی شده است، بنابراین بیایید روی تنظیم احراز هویت GitHub تمرکز کنیم.
قبل از اینکه ادامه دهیم، باید یک برنامه GitHub OAuth با استفاده از حساب GitHub خود ایجاد کنید. Appwrite برای تنظیم احراز هویت GitHub به شناسه مشتری و اسرار نیاز دارد.
با انتخاب روش احراز هویت GitHub Appwrite را فعال کنید Auth
از منوی نوار کناری و پیمایش به Settings
برگه
شناسه مشتری GitHub و راز خود را در تنظیمات GitHub OAuth Appwrite کپی کنید.
در نهایت، اطمینان حاصل کنید که URI تولید شده توسط Appwrite را در تنظیمات برنامه GitHub خود کپی کنید.
راه اندازی پایگاه داده Appwrite
Databases را از منوی نوار کناری انتخاب کنید و یک پایگاه داده جدید ایجاد کنید. شما می توانید آن را نام ببرید novu store
.
بعد، a ایجاد کنید products
مجموعه. این شامل لیستی از محصولات در برنامه خواهد بود.
نام، قیمت و ویژگی های تصویر را به مجموعه اضافه کنید.
در برگه تنظیمات، مجوزها را بهروزرسانی کنید تا به هر کاربر اجازه دهد عملیات CRUD را انجام دهد. با این حال، میتوانید این مورد را پس از استقرار برنامه تغییر دهید تا مطمئن شوید که فقط کاربران تأیید شده میتوانند اقدامات مختلفی را انجام دهند.
در نهایت، ID پروژه، پایگاه داده و مجموعه خود را در یک کپی کنید .env.local
فایل. این کار اعتبارنامه شما را ایمن نگه می دارد و به شما امکان می دهد به هر مقدار از متغیرهای محیط آن ارجاع دهید.
NEXT_PUBLIC_PROJECT_ID=
NEXT_PUBLIC_DB_ID=
NEXT_PUBLIC_PRODUCTS_COLLECTION_ID=
راه اندازی Appwrite Storage
انتخاب کنید Storage
از منوی نوار کناری و ایجاد یک سطل جدید که تمام تصاویر محصول را در خود جای می دهد.
زیر Settings
برگه، مجوزها را به روز کنید تا در حال حاضر به هر کاربری اجازه داده شود.
فرمت های فایل قابل قبول را تنظیم کنید. از آنجایی که ما در حال آپلود تصاویر هستیم، می توانید آن را انتخاب کنید .jpg
و .png
فرمت های فایل
در نهایت شناسه سطل خود را در آن کپی کنید .env.local
فایل.
NEXT_PUBLIC_BUCKET_ID=
تبریک می گویم! شما Appwrite را با موفقیت پیکربندی کردید. اکنون می توانیم با ویژگی های مختلف آن تعامل برقرار کنیم.
نحوه انجام عملیات CRUD با Appwrite
در این بخش، نحوه ایجاد، بازیابی و حذف محصولات از Appwrite را یاد خواهید گرفت. کاربران باید قبل از خرید بتوانند محصولات موجود را مشاهده کنند، در حالی که کاربران Admin باید مجوز اضافه و حذف محصولات را از برنامه داشته باشند.
ابتدا a ایجاد کنید utils.ts
فایل در Next.js app
پوشه این فایل حاوی تمام تعاملات پایگاه داده Appwrite است که می توانید آن را به صفحات ضروری وارد کنید.
cd app
touch utils.ts
ذخیره محصولات در Appwrite
به یاد بیاورید که products
مجموعه سه ویژگی دارد: نام، تصویر و قیمت. بنابراین، هنگام افزودن محصولات به پایگاه داده، ابتدا باید تصویر محصول را آپلود کنید، URL و شناسه آن را از پاسخ بازیابی کنید و سپس URL را به عنوان ویژگی تصویر محصول با استفاده از شناسه ذخیره سازی تصویر برای داده های محصول آپلود کنید.
در اینجا قطعه کدی است که این را توضیح می دهد:
import { db, storage } from "@/app/appwrite";
import { ID } from "appwrite";
export const createProduct = async (
productTitle: string,
productPrice: number,
productImage: any
) => {
try {
//👇🏻 upload the image
const response = await storage.createFile(
process.env.NEXT_PUBLIC_BUCKET_ID!,
ID.unique(),
productImage
);
//👇🏻 get the image's URL
const file_url = `https://cloud.appwrite.io/v1/storage/buckets/${process.env.NEXT_PUBLIC_BUCKET_ID}/files/${response.$id}/view?project=${process.env.NEXT_PUBLIC_PROJECT_ID}&mode=admin`;
//👇🏻 add the product to the database
await db.createDocument(
process.env.NEXT_PUBLIC_DB_ID!,
process.env.NEXT_PUBLIC_PRODUCTS_COLLECTION_ID!,
response.$id, //👉🏻 use the image's ID
{
name: productTitle,
price: productPrice,
image: file_url,
}
);
alert("Product created successfully");
} catch (err) {
console.error(err);
}
};
قطعه کد بالا تصویر را در فضای ذخیره سازی ابری Appwrite آپلود می کند و URL دقیق تصویر را با استفاده از شناسه سطل، شناسه تصویر و شناسه پروژه بازیابی می کند. هنگامی که تصویر با موفقیت آپلود شد، شناسه آن در داده های محصول استفاده می شود تا امکان بازیابی و ارجاع آسان فراهم شود.
بازیابی محصولات از Appwrite
برای واکشی محصولات از Appwrite، میتوانید تابع زیر را در React اجرا کنید useEffect
هنگامی که صفحه بارگیری می شود، قلاب کنید.
export const fetchProducts = async () => {
try {
const products = await db.listDocuments(
process.env.NEXT_PUBLIC_DB_ID!,
process.env.NEXT_PUBLIC_PRODUCTS_COLLECTION_ID!
);
if (products.documents) {
return products.documents;
}
} catch (err) {
console.error(err);
}
};
را fetchProducts
تابع تمام داده های داخل را برمی گرداند products
مجموعه.
حذف محصولات از Appwrite
کاربران ادمین نیز می توانند یک محصول را از طریق شناسه آن حذف کنند. را deleteProduct
تابع شناسه محصول را به عنوان پارامتر می پذیرد و محصول انتخاب شده را از پایگاه داده، از جمله تصویر آن را حذف می کند، زیرا از ویژگی ID یکسانی استفاده می کنند.
export const deleteProduct = async (id: string) => {
try {
await db.deleteDocument(
process.env.NEXT_PUBLIC_DB_ID!,
process.env.NEXT_PUBLIC_PRODUCTS_COLLECTION_ID!,
id
);
await storage.deleteFile(process.env.NEXT_PUBLIC_BUCKET_ID!, id);
alert("Product deleted successfully");
} catch (err) {
console.error(err);
}
};
نحوه احراز هویت کاربران با Appwrite
در بخش های قبلی، روش احراز هویت GitHub را پیکربندی کرده ایم. در اینجا، نحوه مدیریت ورود کاربران به برنامه را خواهید آموخت.
برای اینکه مشتریان بتوانند با استفاده از حساب GitHub خود وارد برنامه شوند، با کلیک روی آن، عملکرد زیر را اجرا کنید Sign in
دکمه. این تابع کاربر را به GitHub هدایت میکند، جایی که میتواند مجوز یا مجوز به برنامه بدهد و سپس وارد برنامه شود:
import { account } from "../appwrite";
import { OAuthProvider } from "appwrite";
const handleGoogleSignIn = async () => {
try {
account.createOAuth2Session(
OAuthProvider.Github,
"http://localhost:3000",
"http://localhost:3000/login"
);
} catch (err) {
console.error(err);
}
};
کاربران ادمین می توانند با استفاده از ایمیل و رمز عبور وارد اپلیکیشن شوند. Appwrite قبل از اجازه دسترسی به داشبورد برنامه، اعتبارنامه ها را تأیید می کند.
import { account } from "@/app/appwrite";
const handleLogin = async (e: React.FormEvent) => {
e.preventDefault();
try {
await account.createEmailPasswordSession(email, password);
alert(`Welcome back 🎉`);
router.push("/admin/dashboard");
} catch (err) {
console.error(err);
alert("Invalid credentials ❌");
}
};
Appwrite همچنین به شما امکان می دهد داده های کاربر فعلی را واکشی کنید. به عنوان مثال، اگر فقط کاربران احراز هویت شده می توانند پرداخت را انجام دهند، می توانید این کار را با اجرای قطعه کد زیر انجام دهید. دادههای کاربر فعلی را بازیابی میکند یا اگر کاربر وارد نشده باشد، null را برمیگرداند.
import { account } from "@/app/appwrite";
useEffect(() => {
const checkAuthStatus = async () => {
try {
const request = await account.get();
setUser(request);
} catch (err) {
console.log(err);
}
};
checkAuthStatus();
}, []);
نحوه افزودن پرداخت پرداخت Stripe به Next.js
در این بخش، نحوه پیاده سازی پرداخت Stripe را در اپلیکیشن یاد خواهید گرفت. Stripe یک پلت فرم پردازش پرداخت آنلاین محبوب است که به شما امکان می دهد محصولاتی ایجاد کنید و روش های پرداخت یکباره و تکراری را در برنامه خود ادغام کنید.
ابتدا باید یک حساب Stripe ایجاد کنید. برای این آموزش می توانید از اکانت حالت تست استفاده کنید.
را کلیک کنید Developers
از منوی بالا و کلید مخفی خود را از منوی کلیدهای API کپی کنید.
کلید مخفی Stripe خود را در آن قرار دهید .env.local
فایل.
STRIPE_SECRET_KEY=
Stripe Node.js SDK را نصب کنید.
npm install stripe
بعد، یک را ایجاد کنید api
پوشه در Next.js app
پوشه را api
پوشه شامل تمام مسیرهای API و نقاط پایانی برنامه خواهد بود.
cd app
mkdir api
ایجاد یک checkout
نقطه پایانی با افزودن a checkout
پوشه در داخل api
پوشه
cd api
mkdir checkout && cd checkout
touch route.ts
قطعه کد زیر را در قسمت کپی کنید route.ts
فایل.
import { NextRequest, NextResponse } from "next/server";
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
export async function POST(req: NextRequest) {
//👇🏻 accepts the customer's cart
const cart = await req.json();
try {
//👇🏻 creates a checkout session
const session = await stripe.checkout.sessions.create({
payment_method_types: ["card"],
line_items: cart.map((product: Product) => ({
price_data: {
currency: "usd",
product_data: {
name: product.name,
},
unit_amount: product.price * 100,
},
quantity: 1,
})),
mode: "payment",
cancel_url: `http://localhost:3000/?canceled=true`,
success_url: `http://localhost:3000?success=true&session_id={CHECKOUT_SESSION_ID}`,
});
//👇🏻 return the session URL
return NextResponse.json({ session: session.url }, { status: 200 });
} catch (err) {
return NextResponse.json({ err }, { status: 500 });
}
}
قطعه کد بالا یک نقطه پایانی را ایجاد می کند که درخواست های POST را می پذیرد. یک جلسه پرداخت برای مشتری ایجاد می کند و URL جلسه را برمی گرداند.
را cancel_url
و success_url
تعیین کنید پس از تکمیل یا لغو پرداخت، کاربر را به کجا هدایت کنید.
در نهایت، می توانید سبد خرید مشتری را به آدرس ارسال کنید /checkout
زمانی که کاربر تصمیم میگیرد با اجرای قطعه کد زیر، برای محصولات پرداخت کند، نقطه پایانی است:
const processPayment = async (cart: Product[]) => {
try {
if (user !== null) {
//👇🏻 saves cart to local storage
localStorage.setItem("cart", JSON.stringify(cart));
//👇🏻 sends cart to /checkout route
const request = await fetch("/api/checkout", {
method: "POST",
body: JSON.stringify(cart),
headers: { "Content-Type": "application/json" },
});
//👇🏻 retrieves the session URL
const { session } = await request.json();
//👇🏻 redirects the user to the checkout page
window.location.assign(session);
} else {
//👇🏻 redirects unauthenticated users
router.push("/login");
}
} catch (err) {
console.error(err);
}
};
قطعه کد بالا سبد خرید را در حافظه محلی مرورگر ذخیره می کند و آن را به نقطه پایانی API می فرستد، سپس پاسخ (URL جلسه) را از سرور backend بازیابی می کند و کاربر را به صفحه پرداخت Stripe هدایت می کند.
ارسال اعلان های درون برنامه ای و ایمیلی با Novu
Novu اولین زیرساخت اطلاع رسانی است که یک API یکپارچه برای ارسال اعلان ها از طریق کانال های متعدد از جمله In-App، Push، Email، SMS و Chat ارائه می دهد.
در این بخش، یاد خواهید گرفت که چگونه Novu را به برنامه خود اضافه کنید تا بتوانید ایمیل و پیام های درون برنامه ای ارسال کنید.
ابتدا بسته های Novu مورد نیاز را نصب کنید:
npm install @novu/node @novu/echo @novu/notification-center
هنگامی که کاربران خریدی انجام می دهند، یک ایمیل تأیید پرداخت دریافت می کنند و کاربر مدیر نیز یک اعلان درون برنامه ای دریافت می کند.
برای انجام این کار، باید یک حساب کاربری در Novu ایجاد کنید و یک ارائه دهنده ایمیل اصلی راه اندازی کنید. برای این آموزش از ارسال مجدد استفاده خواهیم کرد.
پس از ایجاد یک حساب کاربری در Novu، یک حساب ارسال مجدد ایجاد کنید و انتخاب کنید API Keys
از منوی نوار کناری داشبورد خود برای ایجاد یکی.
بعد، به داشبورد Novu خود برگردید، انتخاب کنید Integrations Store
از منوی نوار کناری، ارسال مجدد را به عنوان ارائه دهنده ایمیل اضافه کنید. باید کلید API و آدرس ایمیل ارسال مجدد خود را در فیلدهای لازم جایگذاری کنید.
انتخاب کنید تنظیمات از منوی نوار کناری و کپی کنید Novu API
کلید و App ID
درون یک .env.local
مطابق شکل زیر فایل کنید. همچنین، خود را کپی کنید subscriber ID
در زمینه خود – شما می توانید این را از Subscribers
بخش.
NOVU_API_KEY=
NEXT_PUBLIC_NOVU_API_KEY=
NEXT_PUBLIC_NOVU_APP_ID=
NOVU_SUBSCRIBER_ID=
NEXT_PUBLIC_NOVU_SUBSCRIBER_ID=
در نهایت زنگ نوتیفیکیشن Novu را به داشبورد مدیریت اضافه کنید تا کاربران ادمین بتوانند اعلانها را در برنامه دریافت کنند.
import {
NovuProvider,
PopoverNotificationCenter,
NotificationBell,
} from "@novu/notification-center";
export default function AdminNav() {
return (
<NovuProvider
subscriberId={process.env.NEXT_PUBLIC_NOVU_SUBSCRIBER_ID!}
applicationIdentifier={process.env.NEXT_PUBLIC_NOVU_APP_ID!}
>
<PopoverNotificationCenter colorScheme='light'>
{({ unseenCount }) => <NotificationBell unseenCount={unseenCount} />}
PopoverNotificationCenter>
NovuProvider>
);
}
نحوه ایجاد گردش کار اعلان با Novu Echo
Novu یک موتور گردش کار کد اول را ارائه می دهد که به شما امکان می دهد گردش کار اعلان را در پایگاه کد خود ایجاد کنید. این امکان را به شما می دهد تا ایمیل، پیامک، قالب چت و تولید کننده محتوا، مانند React Email و MJML را در Novu ادغام کنید تا اعلان های پیشرفته و قدرتمندی ایجاد کنید.
در این بخش، نحوه ایجاد گردش کار اعلان در برنامه خود، استفاده از الگوهای اعلان ایمیل با Novu و ارسال اعلان های درون برنامه ای و ایمیلی با Novu را خواهید آموخت.
React Email را با اجرای دستور زیر نصب کنید:
npm install react-email @react-email/components -E
اسکریپت زیر را در فایل package.json خود قرار دهید. را --dir
پرچم به React Email دسترسی به قالبهای ایمیلی که در داخل پروژه قرار دارند میدهد. در این حالت، الگوهای ایمیل در src/emails
پوشه
{
"scripts": {
"email": "email dev --dir src/emails"
}
}
بعد، یک را ایجاد کنید emails
پوشه حاوی یک email.tsx
در Next.js app
پوشه و قطعه کد زیر را در فایل کپی کنید:
import {
Body,
Column,
Container,
Head,
Heading,
Hr,
Html,
Link,
Preview,
Section,
Text,
Row,
render,
} from "@react-email/components";
import * as React from "react";
const EmailTemplate = ({
message,
subject,
name,
}: {
message: string;
subject: string;
name: string;
}) => (
<Html>
<Head />
<Preview>{subject}Preview>
<Body style={main}>
<Container style={container}>
<Section style={header}>
<Row>
<Column style={headerContent}>
<Heading style={headerContentTitle}>{subject}Heading>
Column>
Row>
Section>
<Section style={content}>
<Text style={paragraph}>Hey {name},Text>
<Text style={paragraph}>{message}Text>
Section>
Container>
<Section style={footer}>
<Text style={footerText}>
You're receiving this email because your subscribed to Newsletter
App
Text>
<Hr style={footerDivider} />
<Text style={footerAddress}>
<strong>Novu Storestrong>, ©{" "}
<Link href='https://novu.co'>NovuLink>
Text>
Section>
Body>
Html>
);
export function renderEmail(inputs: {
message: string;
subject: string;
name: string;
}) {
return render(<EmailTemplate {...inputs} />);
}
const main = {
backgroundColor: "#f3f3f5",
fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif",
};
const headerContent = { padding: "20px 30px 15px" };
const headerContentTitle = {
color: "#fff",
fontSize: "27px",
fontWeight: "bold",
lineHeight: "27px",
};
const paragraph = {
fontSize: "15px",
lineHeight: "21px",
color: "#3c3f44",
};
const divider = {
margin: "30px 0",
};
const container = {
width: "680px",
maxWidth: "100%",
margin: "0 auto",
backgroundColor: "#ffffff",
};
const footer = {
width: "680px",
maxWidth: "100%",
margin: "32px auto 0 auto",
padding: "0 30px",
};
const content = {
padding: "30px 30px 40px 30px",
};
const header = {
borderRadius: "5px 5px 0 0",
display: "flex",
flexDireciont: "column",
backgroundColor: "#2b2d6e",
};
const footerDivider = {
...divider,
borderColor: "#d6d8db",
};
const footerText = {
fontSize: "12px",
lineHeight: "15px",
color: "#9199a1",
margin: "0",
};
const footerLink = {
display: "inline-block",
color: "#9199a1",
textDecoration: "underline",
fontSize: "12px",
marginRight: "10px",
marginBottom: "0",
marginTop: "8px",
};
const footerAddress = {
margin: "4px 0",
fontSize: "12px",
lineHeight: "15px",
color: "#9199a1",
};
قطعه کد بالا با استفاده از React Email یک الگوی ایمیل قابل تنظیم ایجاد می کند. میتوانید الهامها یا قالبهای سادهتر را پیدا کنید. کامپوننت همچنین یک پیام، موضوع و نام را به عنوان پروپوزال می پذیرد و آنها را در عناصر پر می کند.
در نهایت می توانید بدوید npm run email
در ترمینال خود برای پیش نمایش الگو.
در مرحله بعد، بیایید قالب ایمیل را با Novu Echo ادغام کنیم. ابتدا سرور React Email را ببندید و قطعه کد زیر را اجرا کنید. Novu Dev Studio را در مرورگر شما باز می کند.
npx novu-labs@latest echo
ایجاد کنید echo
پوشه حاوی الف client.ts
در پوشه برنامه Next.js فایل کنید و این قطعه کد را در فایل کپی کنید.
import { Echo } from "@novu/echo";
import { renderEmail } from "@/app/emails/email";
interface EchoProps {
step: any;
payload: {
subject: string;
message: string;
name: string;
totalAmount: string;
};
}
export const echo = new Echo({
apiKey: process.env.NEXT_PUBLIC_NOVU_API_KEY!,
devModeBypassAuthentication: process.env.NODE_ENV === "development",
});
echo.workflow(
"novu-store",
async ({ step, payload }: EchoProps) => {
//👇🏻 in-app notification step
await step.inApp("notify-admin", async () => {
return {
body: `${payload.name} just made a new purchase of ${payload.totalAmount} 🎉`,
};
});
//👇🏻 email notification step
await step.email(
"email-customer",
async () => {
return {
subject: `${payload ? payload?.subject : "No Subject"}`,
body: renderEmail(payload),
};
},
{
inputSchema: {
type: "object",
properties: {},
},
}
);
},
{
payloadSchema: {
type: "object",
properties: {
message: {
type: "string",
default: "Congratulations! Your purchase was successful! 🎉",
},
subject: { type: "string", default: "Message from Novu Store" },
name: { type: "string", default: "User" },
totalAmount: { type: "string", default: "0" },
},
required: ["message", "subject", "name", "totalAmount"],
additionalProperties: false,
},
}
);
قطعه کد یک گردش کاری نوتیفیکیشن Novu را با نام تعریف می کند novu-store
، که باری حاوی موضوع ایمیل، پیام، نام مشتری و کل مبلغ را می پذیرد.
گردش کار دو مرحله دارد: اعلان درون برنامه ای و ایمیل. اعلان درون برنامه ای با استفاده از زنگ اعلان به مدیر و ایمیل پیامی به ایمیل مشتری ارسال می کند.
در مرحله بعد، باید یک مسیر API برای Novu Echo ایجاد کنید. در داخل api
پوشه، ایجاد کنید email
پوشه حاوی الف route.ts
فایل و قطعه کد ارائه شده در زیر را در فایل کپی کنید.
import { serve } from "@novu/echo/next";
import { echo } from "@/app/echo/client";
export const { GET, POST, PUT } = serve({ client: echo });
اجرا کن npx novu-labs@latest echo
در ترمینال شما بهطور خودکار Novu Dev Studio را باز میکند، جایی که میتوانید گردش کار خود را پیشنمایش کنید و آن را با Cloud همگامسازی کنید.
را Sync to Cloud
دکمه یک پنجره بازشو راهاندازی میکند که دستورالعملهایی را درباره نحوه انتقال گردش کار به Novu Cloud ارائه میدهد.
برای ادامه، قطعه کد زیر را در ترمینال خود اجرا کنید. این یک URL منحصر به فرد ایجاد می کند که نشان دهنده یک تونل محلی بین محیط توسعه شما و محیط ابری است.
npx localtunnel --port 3000
پیوند ایجاد شده را به همراه نقطه پایانی Echo API خود در قسمت Echo Endpoint کپی کنید، روی آن کلیک کنید Create Diff
را فشار دهید و تغییرات را اعمال کنید.
https:///(/api/email)>
تبریک می گویم! شما به تازگی یک گردش کار Novu را از پایگاه کد خود ایجاد کرده اید.
در نهایت، اجازه دهید نقطه پایانی را ایجاد کنیم که هنگام پرداخت یک کاربر، ایمیل و اعلانهای درون برنامهای را ارسال میکند. ایجاد کنید api/send
مسیر و قطعه کد زیر را در فایل کپی کنید:
import { NextRequest, NextResponse } from "next/server";
import { Novu } from "@novu/node";
const novu = new Novu(process.env.NOVU_API_KEY!);
export async function POST(req: NextRequest) {
const { email, name, totalAmount } = await req.json();
const { data } = await novu.trigger("novu-store", {
to: {
subscriberId: process.env.NOVU_SUBSCRIBER_ID!,
email,
firstName: name,
},
payload: {
name,
totalAmount,
subject: `Purchase Notification from Novu Store`,
message: `Your purchase of ${totalAmount} was successful! 🎉`,
},
});
console.log(data.data);
return NextResponse.json(
{
message: "Purchase Completed!",
data: { novu: data.data },
success: true,
},
{ status: 200 }
);
}
نقطه پایانی ایمیل، نام و کل مبلغ پرداختی مشتری را میپذیرد و گردش کار اعلان Novu را برای ارسال اعلانهای مورد نیاز پس از موفقیتآمیز پرداخت فعال میکند.
نتیجه
تاکنون یاد گرفته اید که چگونه کارهای زیر را انجام دهید:
- چندین روش احراز هویت را پیاده سازی کنید، داده ها و فایل ها را از Appwrite ذخیره و بازیابی کنید.
- با React Email قالب های ایمیل ایجاد کنید و با Novu اعلان های درون برنامه ای و ایمیل ارسال کنید.
اگر مشتاقانه منتظر ارسال اعلان ها در برنامه های خود هستید، Novu بهترین انتخاب شما است. با Novu میتوانید چندین کانال اعلان از جمله چت، پیامک، ایمیل، فشار و اعلانهای درونبرنامه را به برنامههای خود اضافه کنید.
کد منبع این آموزش در اینجا موجود است:
https://github.com/novuhq/ecom-store-with-nextjs-appwrite-novu-and-stripe
با تشکر از شما برای خواندن!