برنامه نویسی

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

در این آموزش، نحوه ایجاد یک فروشگاه تجارت الکترونیکی را خواهید آموخت که در آن مشتریان می توانند محصولات را خریداری کرده و از طریق Stripe پرداخت کنند. پس از پرداخت موفقیت آمیز، یک اعلان ایمیل برای مشتری و یک اعلان درون برنامه ای برای کاربر Admin ارسال می شود. کاربر Admin همچنین می تواند محصولات را در برنامه ایجاد و حذف کند.

برای ساخت این اپلیکیشن از ابزارهای زیر استفاده خواهیم کرد:

  • Appwrite – برای احراز هویت کاربران و همچنین ذخیره و بازیابی جزئیات محصول.

  • Next.js – برای ایجاد رابط کاربری و باطن برنامه.

  • Novu – برای ارسال ایمیل و اعلان های درون برنامه ای.

  • React Email – برای ایجاد الگوهای ایمیل.

  • Stripe – برای ادغام پرداخت پرداخت با برنامه.

برنامه


ساخت رابط برنامه با Next.js

صفحات اپلیکیشن بر اساس نقش هایی که به کاربران اختصاص داده می شود به دو قسمت تقسیم می شوند. مشتریان می توانند قبل از پرداخت به صفحه اصلی دسترسی داشته باشند و به برنامه وارد شوند. کاربران ادمین می توانند به همه صفحات از جمله صفحه ورود به سیستم و صفحه داشبورد دسترسی داشته باشند که در آن می توانند محصولات را اضافه و حذف کنند.

حالا بیایید اپلیکیشن را بسازیم.

https://media1.giphy.com/media/iopxsZtW2QVRs4poEC/giphy.gif?cid=7941fdc6aot3qt7vvq4voh5c1iagyusdpuga713m8ljqcqmd&ep=v1_gifs_search&rid=ct=g.

با اجرای قطعه کد زیر یک پروژه 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 فایل. لیستی از محصولات را بر روی صفحه نمایش می دهد و به کاربران امکان می دهد مواردی را در یک سبد خرید مانند تصویر زیر انتخاب کنند.

1

یک مسیر ورود به سیستم ایجاد کنید که به کاربران امکان می دهد با استفاده از حساب 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 فایل برای ایجاد رابط کاربری

2

تبریک می گویم! شما رابط برنامه را ساخته اید. در بخش‌های آتی، نحوه اتصال برنامه به پشتیبان Appwrite و ارسال داده‌ها بین مشتری و سرور را خواهید آموخت.


چگونه Appwrite را به برنامه Next.js اضافه کنیم

Appwrite یک سرویس باطن منبع باز است که به شما امکان می دهد برنامه های نرم افزاری ایمن و مقیاس پذیر ایجاد کنید. ویژگی‌هایی مانند روش‌های احراز هویت چندگانه، پایگاه داده ایمن، ذخیره‌سازی فایل، پیام‌رسانی ابری و موارد دیگر را ارائه می‌دهد که برای ساخت برنامه‌های فول استک ضروری هستند.

در این بخش، نحوه راه اندازی یک پروژه Appwrite شامل ویژگی هایی مانند احراز هویت، پایگاه داده و ذخیره سازی فایل را یاد خواهید گرفت.

ابتدا از Appwrite Cloud دیدن کنید و یک حساب کاربری و سازمان برای پروژه های خود ایجاد کنید.

بعد، یک پروژه جدید ایجاد کنید و منطقه مورد نظر خود را برای میزبانی پروژه انتخاب کنید.

اپ رایت 1

انتخاب کنید Web به عنوان پلتفرم SDK برای برنامه.

اپ رایت 2

مراحل نمایش داده شده روی صفحه را دنبال کنید. از آنجایی که در حال حاضر در حال ساخت در حالت توسعه هستید، می توانید از علامت عام استفاده کنید (*) به عنوان نام میزبان خود و پس از استقرار برنامه آن را به نام دامنه خود تغییر دهید.

اپ رایت 3

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 1

با انتخاب روش احراز هویت GitHub Appwrite را فعال کنید Auth از منوی نوار کناری و پیمایش به Settings برگه

اپ رایت 4

شناسه مشتری GitHub و راز خود را در تنظیمات GitHub OAuth Appwrite کپی کنید.

اسکرین شات 24/05/2024 در 19.45.36.png

در نهایت، اطمینان حاصل کنید که URI تولید شده توسط Appwrite را در تنظیمات برنامه GitHub خود کپی کنید.

GitHub 2

راه اندازی پایگاه داده Appwrite

Databases را از منوی نوار کناری انتخاب کنید و یک پایگاه داده جدید ایجاد کنید. شما می توانید آن را نام ببرید novu store.

اپ رایت 5

بعد، a ایجاد کنید products مجموعه. این شامل لیستی از محصولات در برنامه خواهد بود.

اپ رایت 6

نام، قیمت و ویژگی های تصویر را به مجموعه اضافه کنید.

اپ رایت 7

در برگه تنظیمات، مجوزها را به‌روزرسانی کنید تا به هر کاربر اجازه دهد عملیات CRUD را انجام دهد. با این حال، می‌توانید این مورد را پس از استقرار برنامه تغییر دهید تا مطمئن شوید که فقط کاربران تأیید شده می‌توانند اقدامات مختلفی را انجام دهند.

اپ رایت 8

در نهایت، ID پروژه، پایگاه داده و مجموعه خود را در یک کپی کنید .env.local فایل. این کار اعتبارنامه شما را ایمن نگه می دارد و به شما امکان می دهد به هر مقدار از متغیرهای محیط آن ارجاع دهید.

NEXT_PUBLIC_PROJECT_ID=
NEXT_PUBLIC_DB_ID=
NEXT_PUBLIC_PRODUCTS_COLLECTION_ID=
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

راه اندازی Appwrite Storage

انتخاب کنید Storage از منوی نوار کناری و ایجاد یک سطل جدید که تمام تصاویر محصول را در خود جای می دهد.

اپ رایت 9

زیر Settings برگه، مجوزها را به روز کنید تا در حال حاضر به هر کاربری اجازه داده شود.

اپ رایت 10

فرمت های فایل قابل قبول را تنظیم کنید. از آنجایی که ما در حال آپلود تصاویر هستیم، می توانید آن را انتخاب کنید .jpg و .png فرمت های فایل

اپ رایت 11

در نهایت شناسه سطل خود را در آن کپی کنید .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 ایجاد کنید. برای این آموزش می توانید از اکانت حالت تست استفاده کنید.

راه راه 1

را کلیک کنید Developers از منوی بالا و کلید مخفی خود را از منوی کلیدهای API کپی کنید.

راه راه 2

کلید مخفی 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 هدایت می کند.

راه راه 3


ارسال اعلان های درون برنامه ای و ایمیلی با Novu

Novu اولین زیرساخت اطلاع رسانی است که یک API یکپارچه برای ارسال اعلان ها از طریق کانال های متعدد از جمله In-App، Push، Email، SMS و Chat ارائه می دهد.

در این بخش، یاد خواهید گرفت که چگونه Novu را به برنامه خود اضافه کنید تا بتوانید ایمیل و پیام های درون برنامه ای ارسال کنید.

ابتدا بسته های Novu مورد نیاز را نصب کنید:

npm install @novu/node @novu/echo @novu/notification-center
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگامی که کاربران خریدی انجام می دهند، یک ایمیل تأیید پرداخت دریافت می کنند و کاربر مدیر نیز یک اعلان درون برنامه ای دریافت می کند.

برای انجام این کار، باید یک حساب کاربری در Novu ایجاد کنید و یک ارائه دهنده ایمیل اصلی راه اندازی کنید. برای این آموزش از ارسال مجدد استفاده خواهیم کرد.

پس از ایجاد یک حساب کاربری در Novu، یک حساب ارسال مجدد ایجاد کنید و انتخاب کنید API Keys از منوی نوار کناری داشبورد خود برای ایجاد یکی.

ارسال مجدد 1

بعد، به داشبورد Novu خود برگردید، انتخاب کنید Integrations Store از منوی نوار کناری، ارسال مجدد را به عنوان ارائه دهنده ایمیل اضافه کنید. باید کلید API و آدرس ایمیل ارسال مجدد خود را در فیلدهای لازم جایگذاری کنید.

جدید 1

انتخاب کنید تنظیمات از منوی نوار کناری و کپی کنید 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=
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

جدید 2

در نهایت زنگ نوتیفیکیشن 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 همگام‌سازی کنید.

جدید 3

را Sync to Cloud دکمه یک پنجره بازشو راه‌اندازی می‌کند که دستورالعمل‌هایی را درباره نحوه انتقال گردش کار به Novu Cloud ارائه می‌دهد.

جدید 4

برای ادامه، قطعه کد زیر را در ترمینال خود اجرا کنید. این یک URL منحصر به فرد ایجاد می کند که نشان دهنده یک تونل محلی بین محیط توسعه شما و محیط ابری است.

npx localtunnel --port 3000
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پیوند ایجاد شده را به همراه نقطه پایانی Echo API خود در قسمت Echo Endpoint کپی کنید، روی آن کلیک کنید Create Diff را فشار دهید و تغییرات را اعمال کنید.

https:///(/api/email)> 
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تبریک می گویم! شما به تازگی یک گردش کار Novu را از پایگاه کد خود ایجاد کرده اید.

جدید 5

در نهایت، اجازه دهید نقطه پایانی را ایجاد کنیم که هنگام پرداخت یک کاربر، ایمیل و اعلان‌های درون برنامه‌ای را ارسال می‌کند. ایجاد کنید 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

با تشکر از شما برای خواندن!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا