ساخت فروشگاه تجارت الکترونیک: راهنمای گام به گام با Solidjs و Medusa

معرفی
اصطلاح “تجارت الکترونیک” به سادگی به فروش آنلاین کالاها و خدمات اشاره دارد.
مردم می توانند از یک فروشگاه تجارت الکترونیک برای خرید و فروش کالاهای ملموس (فیزیکی)، محصولات دیجیتال یا خدمات آنلاین استفاده کنند. شما با استفاده از Solid (به عنوان ویترین فروشگاه) و Medusa (به عنوان باطن) یک فروشگاه تجارت الکترونیک خواهید ساخت.
با ایجاد این برنامه، یاد خواهید گرفت:
-
نحوه راه اندازی سرور مدوزا و ادمین مدوزا.
-
چگونه با استفاده از Solid یک فروشگاه تجارت الکترونیک ایجاد کنیم.
-
نحوه ادغام جامد با مدوسا
-
نحوه حلقه زدن روی آرایه ای از اشیا با استفاده از
<For>
جزء. -
نحوه ایجاد مسیریابی سمت کلاینت با استفاده از Solid Router.
-
چگونه با استفاده از Material UI UI های زیبا ایجاد کنیم
و خیلی بیشتر…
Medusa یک موتور تجارت الکترونیکی قابل ترکیب متن باز برای توسعه دهندگانی است که می خواهند مالکیت پشته تجارت الکترونیکی خود را به دست بگیرند. مدوسا از سه بخش تشکیل شده است:
-
باطن بی سر.
-
داشبورد مدیریت
-
ویترین.
Medusa یک پلت فرم همه کاره تجارت الکترونیک جاوا اسکریپت است که توسعه دهندگان را قادر می سازد بدون توجه به چارچوبی که برای ساخت برنامه های وب خود استفاده می کنند از ویژگی ها و قابلیت های آن استفاده کنند.
Solid یک چارچوب جاوا اسکریپت پرسرعت است که از دستکاری dom مجازی جلوگیری می کند. Solid یک چارچوب جاوا اسکریپت برای ساخت برنامه های کاربردی وب تعاملی است.
با Solid، میتوانید از دانش موجود در HTML و جاوا اسکریپت برای ساخت مؤلفههایی استفاده کنید که میتوانند در سراسر برنامهتان دوباره استفاده شوند. Solid ابزارهایی را برای تقویت اجزای شما با واکنشپذیری ارائه میکند: کد جاوا اسکریپت اعلامی که رابط کاربر را با دادههایی که استفاده میکند و ایجاد میکند پیوند میدهد.
بیایید با استفاده از Solid یک وب سایت تجارت الکترونیک جالب ایجاد کنیم.
شروع کار با مدوسا
در این بخش از این مقاله، من قصد دارم به شما نشان دهم که چگونه سرور مدوسا را بر روی دستگاه محلی خود راه اندازی کنید.
مرحله 1: ابزار Medusa CLI را نصب کنید
Medusa CLI ابزاری است که به شما امکان می دهد دستورات مهم را هنگام کار با مدوسا اجرا کنید.
برای استفاده از مدوسا ابتدا باید ابزار CLI را نصب کنید که برای ایجاد سرور جدید مدوسا استفاده می شود.
با استفاده از هر کدام npm
یا yarn
، می توانیم Medusa CLI را نصب کنیم، اما این آموزش استفاده خواهد کرد npm
. هر ترمینال دلخواه خود را باز کنید و دستور زیر را اجرا کنید:
npm install @medusajs/medusa-cli -g
مرحله 2: یک سرور فروشگاه مدوسا جدید ایجاد کنید
سرور فروشگاه جزء اصلی است که تمام منطق و داده های فروشگاه را در خود جای می دهد.
این سرور شامل تمام عملکردهای مربوط به گردش کار پرداخت فروشگاه شما خواهد بود. مدیریت سبد خرید، حمل و نقل، حمل و نقل، ارائه دهندگان پرداخت، مدیریت کاربر، و ویژگی های دیگر گنجانده شده است.
دستور زیر را برای ایجاد سرور فروشگاه مدوسا جدید خود اجرا کنید:
medusa new my-medusa-store --seed
نکاتی که در دستور قبلی باید به آن توجه کنید:
-
my-medusa-store
نشان دهنده نام پروژه است که می توانید آن را به هر چیزی که می خواهید تغییر دهید. -
را
--seed
دستور پایگاه داده شما را با برخی از داده های نمونه برای شروع کار شما می سازد. از جمله فروشگاه، حساب سرپرست، منطقه و محصولات با انواع مختلف.
مرحله 3: سرور فروشگاه مدوسا را تست کنید
برای تست سرور فروشگاه مدوسا، سی دی را وارد کنید my-medusa-store
و دستور زیر را اجرا کنید:
medusa develop
هدایت به localhost:9000/store/products/
در مرورگر شما، و موارد زیر باید ظاهر شود:
مرحله 4: مدیریت مدوسا را تنظیم کنید
داشبورد مدیریت مدوسا به ما اجازه می دهد تا انواع عملکردها را روی داده های سیستم خود انجام دهیم. راهی برای ایجاد محصولات جدید، ویرایش محصولات، حذف محصولات، مشاهده سفارشات و غیره برای شما فراهم می کند.
ادمین مدوسا به سرور فروشگاه مدوسا متصل است، بنابراین قبل از ادامه کار با ادمین ابتدا مطمئن شوید که سرور فروشگاه مدوسا را با موفقیت نصب و آزمایش کرده اید.
برای نصب ادمین، با شبیه سازی مخزن ادمین Github شروع کنید:
git clone https://github.com/medusajs/admin medusa-admin
در مرحله بعد، سی دی را وارد کنید medusa-admin
دایرکتوری و با استفاده از npm وابستگی ها را نصب کنید:
npm install
مرحله 5: ادمین مدوسا را تست کنید
برای اجرای ادمین مدوسا، دستور زیر را تایپ کنید:
npm start
اکنون به مسیر بروید localhost:7000
در مرورگر خود برای مشاهده صفحه مدیریت:
ایمیل است admin@medusa-test.com
و رمز عبور است supersecret
.
توجه داشته باشید: قبل از اینکه بتوانید ادمین مدوسا را آزمایش کنید، باید مطمئن شوید که سرور مدوزا در حال اجرا است.
ساخت ویترین فروشگاه با جامد
در این بخش از مقاله، نحوه استفاده از Solidjs برای ساخت ویترین فروشگاه برای برنامه تجارت الکترونیک خود را نشان خواهم داد.
مرحله 1: یک برنامه Solid جدید ایجاد کنید
دستور زیر را در ترمینال خود اجرا کنید تا یک برنامه Solid جدید ایجاد کنید:
npx degit solidjs/templates/js solid-app
بعد، cd
به solid-app
و وابستگی های آن را نصب کنید:
cd solid-app
npm install
پس از اتمام نصب، سرور توسعه محلی خود را راه اندازی کنید:
npm run dev
مرحله 2: همه وابستگی های ضروری را نصب کنید
برای ساخت سریعتر اپلیکیشن تجارت الکترونیک، به برخی وابستگی ها نیاز دارید.
ما قادر خواهیم بود به راحتی رابط های کاربری خیره کننده ای با کمک ایجاد کنیم رابط کاربری مواد. برای نصب Material UI for Solid دستور زیر را اجرا کنید:
npm install @suid/material @suid/icons-material
روتر جامد یک روتر جهانی برای Solidjs است که چه روی کلاینت و چه روی سرور رندر میشود. برای نصب Solid Router دستور زیر را اجرا کنید:
npm i @solidjs/router
مدوسا JS Client یک SDK است که راهی آسان برای دسترسی به API مدوزا را فراهم می کند. برای نصب مدوسا JS Client دستور زیر را اجرا کنید:
npm install @medusajs/medusa-js
مرحله 3: Solid را با Medusa ادغام کنید
در ریشه پروژه برنامه جامد خود، a ایجاد کنید .env
فایل و محتوای زیر را به آن اضافه کنید:
VITE_baseUrl=http://localhost:9000
baseUrl
متغیر محیطی URL سرور مدوسای شما است.
مدوزا از Cross-Origin Resource Sharing (CORS) استفاده می کند تا فقط به منابع خاصی اجازه دسترسی به سرور را بدهد.
باید Vite را پیکربندی کنید زیرا مدوزا به طور پیشفرض فقط دسترسی به ویترین فروشگاه در پورت را میپذیرد 8000، در حالی که پورت پیش فرض Vite است 5173.
پیمایش به vite.config.json
و مطالب زیر را جایگزین کنید:
import { defineConfig } from 'vite';
import solidPlugin from 'vite-plugin-solid';
//https://vitejs.dev/config/
export default defineConfig({
plugins: [solidPlugin()],
server: {
port: 8000,
},
build: {
target: 'esnext',
},
});
یک برگه مرورگر جدید باز کنید و به آن بروید http://localhost:8000
پس از راه اندازی مجدد سرور توسعه خود.
توجه داشته باشید: اگر Vite برای استفاده از شماره پورت مورد نیاز پیکربندی نشده باشد، هر درخواستی که ویترین فروشگاه شما به سرور ارائه کند توسط مدوزا رد خواهد شد. 8000.
در مرحله بعد، ابزاری ایجاد کنید که استفاده مجدد از نمونه مدوسا JS Client را در سراسر برنامه شما فعال می کند.
یک فایل جدید ایجاد کنید src/utils/client.js
و مطالب زیر را اضافه کنید:
import Medusa from "@medusajs/medusa-js"
const medusaClient = new Medusa({ baseUrl: import.meta.env.VITE_MEDUSA_SERVER_URL })
export { medusaClient }
مرحله 4: ساخت اجزای فروشگاه
در این بخش از این مقاله، کامپوننت storefront را برای اپلیکیشن خود خواهیم ساخت. یکی از مولفه هایی که قرار است ایجاد کنیم این است:
-
جزء سرصفحه: یک پوشه جدید در
src
دایرکتوری و تماس بگیریدcomponents
. سپس در داخلcomponents
پوشه، یک پوشه جدید بسازیدHeader.jsx
فایل و محتوای زیر را اضافه کنید:
//Header.jsx
import { A } from "@solidjs/router";
import { Box } from "@suid/material";
import { Typography, IconButton, AppBar, Toolbar } from "@suid/material";
import ShoppingCartIcon from "@suid/icons-material/ShoppingCart";
const Header = () => {
const cartCount = localStorage.getItem("cartCount") ?? 0;
return (
<Box>
<AppBar position="fixed" color="primary">
<Toolbar>
<Box
sx={{
display: "flex",
width: "100%",
alignItems: "center",
flexDirection: {
lg: "row",
md: "column",
sm: "column",
xs: "row",
},
justifyContent: "space-between",
}}
>
<Typography
variant="h6"
component="h6"
sx={{
marginBottom: { lg: "0", md: "0.7rem", sm: "0.7rem", xs: "0" },
}}
>
Reuben09
</Typography>
</Box>
<Box
sx={{
display: "flex",
alignItems: "center",
marginBottom: { lg: "0", md: "0.7rem", sm: "0.7rem", xs: "0" },
}}
>
<A href="/">
<Typography
sx={{
marginRight: "1rem",
fontSize: "1.1rem",
cursor: "pointer",
}}
>
Home
</Typography>
</A>
<A href="/products">
<Typography
sx={{
marginRight: "1rem",
fontSize: "1.1rem",
cursor: "pointer",
}}
>
Products
</Typography>
</A>
<IconButton>
<ShoppingCartIcon sx={{ color: "#fff" }} />
</IconButton>
<p>{cartCount}</p>
</Box>
</Toolbar>
</AppBar>
</Box>
);
};
export default Header;
-
جزء لیست محصولات: این مؤلفه لیستی از محصولات دریافت شده از سرور مدوزا را با استفاده از
medusaClient
تابع ابزار، با استفاده از Solid Router، مؤلفه همچنین پیوندهایی را به محصولات جداگانه ایجاد می کند.درون
components
پوشه، یک فایل جدید بسازید و آن را فراخوانی کنیدProductList.jsx
. جدید ایجاد شده را باز کنیدProductList.jsx
فایل و محتوای زیر را اضافه کنید:
//ProductList.jsx
import { createEffect, createSignal, For } from "solid-js";
import { A } from "@solidjs/router";
import { Box, Typography, Link } from "@suid/material";
import { medusaClient } from "../utils/client.js";
function ProductList() {
const [products, setProducts] = createSignal([]);
createEffect(() => {
const fetchProducts = async () => {
const res = await medusaClient.products.list();
setProducts(res.products);
};
fetchProducts();
});
return (
<>
<Box
sx={{
marginTop: "2rem",
paddingLeft: { lg: "4rem", xs: "1.5rem" },
paddingRight: { lg: "4rem", xs: "1.5rem" },
}}
component="section"
>
<Typography
sx={{
textAlign: "center",
fontSize: "1.5rem",
marginBottom: "2rem",
}}
>
Featured Products
</Typography>
<Box sx={{ margin: "0 2rem" }}>
<Box
sx={{
display: "grid",
gridTemplateColumns: "1fr 1fr 1fr 1fr",
gridGap: "2rem",
}}
>
<For each={products()}>
{(product) => (
<Box
component="div"
sx={{
backgroundColor: "rgb(231, 231, 231)",
height: "350px",
padding: "0.5rem",
}}
>
<Box component="div" sx={{ height: "12rem" }}>
<Box
component="img"
src={product?.thumbnail}
sx={{
height: "12rem",
width: "100%",
objectFit: "cover",
}}
/>
</Box>
<Typography
sx={{
padding: "1rem 0",
textAlign: "center",
fontWeight: "600",
}}
>
{product?.title}
</Typography>
<Typography sx={{ textAlign: "center" }}>
€ {product?.variants[0].prices[0].amount / 100}
</Typography>
<Box sx={{ textAlign: "center" }}>
<Link underline="always">
<A href={`/products/${product.id}`}>See product</A>
</Link>
</Box>
</Box>
)}
</For>
</Box>
</Box>
</Box>
</>
);
}
export default ProductList;
-
جزء خبرنامه: در
components
پوشه جدید ایجاد کنیدNewsLetter.jsx
فایل و محتوای زیر را اضافه کنید:
import {
Grid,
Box,
Typography,
Input,
IconButton,
Button
} from "@suid/material";
function NewsLetter() {
return (
<Box
component="section"
sx={{
display: "flex",
alignItems: "center",
justifyContent: "center",
flexDirection: "column",
paddingLeft: { lg: "4rem", xs: "2rem" },
paddingRight: { lg: "4rem", xs: "2rem" }
}}
>
<Box component="form">
<Typography
variant="h2"
mt={10}
sx={{
textAlign: "center",
fontSize: "1.5rem",
marginBottom: "0.3rem",
}}
>
{" "}
Subscribe to our newsletter
</Typography>
<Typography sx={{textAlign: "center", marginBottom: "1rem" }}>
Get 10% off your first purchase and stay on top of the latest in
Debutify, it's win-win-WIN!
</Typography>
<Box sx={{marginBottom: "2rem" }}>
<Input
placeholder="First Name"
sx={{textAlign: "center", width: "100%" }}
/>
</Box>
<Box sx={{marginBottom: "2rem" }}>
<Input
placeholder="Your Email"
sx={{textAlign: "center", width: "100%" }}
/>
</Box>
<Box sx={{textAlign: "center", width: "100%", marginBottom: "1rem" }}>
<IconButton>
<Button variant="contained" color="primary">
Subscribe
</Button>
</IconButton>
</Box>
</Box>
</Box>
);
}
export default NewsLetter;
-
جزء پاورقی: همچنین در
components
پوشه جدید ایجاد کنیدFooter.jsx
فایل و این محتوا را اضافه کنید:
import { Box, Typography } from "@suid/material";
import NewsLetter from "./NewsLetter";
function Footer (){
return (
<>
<Box component="section" sx={{ marginBottom: "2rem" }}>
<NewsLetter />
</Box>
<Box
component="div"
sx={{textAlign: "center", backgroundColor: "#1976D2", padding: "1rem" }}
color="primary"
>
<Box
component="a"
sx={{textAlign: "center", color: "#fff" }}
href="https://github.com/Reuben09"
>
created by Reuben09
</Box>
</Box>
</>
)
}
export default Footer;
مرحله 5: صفحات فروشگاهی را ایجاد کنید
از اینجا کار آسان می شود، تنها کاری که باید انجام دهید این است که اجزایی را که در بخش قبلی ایجاد کرده اید در این صفحات وارد کنید:
-
صفحه نخست: یک پوشه جدید در
src
دایرکتوری و تماس بگیریدpages
. سپس در داخلpages
پوشه جدید ایجاد کنیدHome.jsx
فایل و محتوای زیر را اضافه کنید:
import { Box, Typography, IconButton, Button } from "@suid/material";
import ProductList from '../component/ProductList'
import Footer from '../component/Footer'
function Home (){
return <div>
<Box
sx={{
backgroundImage:
"url(https://images.unsplash.com/photo-1552346154-21d32810aba3?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=870&q=80)",
width: "100%",
height: "80vh",
backgroundSize: "cover",
backgroundPosition: "center",
backgroundRepeat: "no-repeat",
marginBottom: "5rem"
}}
>
<Box
sx={{
width: "100%",
height: "80vh",
backgroundColor: "rgba(25, 118, 210, 0.2)",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center"
}}
>
<Typography
sx={{
fontSize: "3rem",
color: "#ffffff",
}}
>
Reuben09
</Typography>
<Typography
sx={{
fontSize: "3rem",
color: "#ffffff",
}}
>
Sneakers
</Typography>
<Typography sx={{textAlign: "center", color: "#ffffff" }}>
Users of the highest converting shopify theme deserve a lifestyle to
match!
</Typography>
<Box sx={{marginTop: "1rem" }}>
<IconButton>
<Button
variant="contained"
color="primary"
sx={{marginRight: "0.5rem" }}
>
Shop now
</Button>
</IconButton>
<IconButton>
<Button
variant="contained"
color="primary"
sx={{marginLeft: "0.5rem" }}
>
Learn more
</Button>
</IconButton>
</Box>
</Box>
</Box>
<Box component="div" sx={{marginBottom: "2rem" }}>
<ProductList />
</Box>
<Box section="footer">
<Footer />
</Box>
</div>
}
export default Home;
-
صفحه محصولات: همچنین در
pages
پوشه، یک پوشه جدید بسازیدProducts.jsx
فایل و محتوای زیر را اضافه کنید:
import ProductList from '../component/ProductList'
import Footer from '../component/Footer'
function Products (){
return <div>
<ProductList />
<Footer />
</div>
}
export default Products;
-
صفحه تک محصول: این صفحه جایی است که اقلام محصول را بر اساس شناسه آنها واکشی می کنیم و جزئیات آنها را نمایش می دهیم. همچنین به کاربران امکان می دهد محصول را به سبد خرید خود اضافه کنند
جدید بساز
SingleProduct.jsx
فایل درpages
پوشه و در محتوای زیر پیست کنید:
import { useParams } from "@solidjs/router";
import { createEffect, createSignal } from 'solid-js'
import {Container, Box, Grid, IconButton, Button, Typography} from '@suid/material';
import Footer from '../component/Footer'
import { medusaClient } from '../utils/client.js'
const addProduct = async (cartId, product) => {
const { cart } = await medusaClient.carts.lineItems.create(cartId, {
variant_id: product()?.variants[0].id,
quantity: 1
})
console.log(cart);
localStorage.setItem('cartCount', cart.items.length)
setTimeout(window.location.reload(), 5000)
}
function SingleProduct (){
const [productItem, setProductItem] = createSignal();
const [regionId, setRegionId] = createSignal("");
const params = useParams();
const productId = params.productId;
createEffect(()=> {
const fetchSingleProduct = async () => {
const results = await medusaClient.products.retrieve(productId);
setProductItem(results.product)
}
const fetchRegions = async () => {
const results = await medusaClient.regions.list()
setRegionId(results.regions[1].id)
}
fetchSingleProduct()
fetchRegions()
})
const handleAddToCart = async () => {
const cartId = localStorage.getItem('cartId');
if (cartId) {
addProduct(cartId, productItem)
} else {
const { cart } = await medusaClient.carts.create({ region_id: regionId })
localStorage.setItem('cartId', cart.id);
addProduct(cart.id, productItem)
}
}
return <>
<Box sx={{marginTop: "7rem"}}>
<Container maxWidth="sm">
<Grid container spacing={2}>
<Grid item xs={6}>
<Box>
<img sx={{width:"500px"}}
alt={productItem()?.title}
src={productItem()?.thumbnail} />
</Box>
</Grid>
<Grid item xs={6}>
<Box sx={{marginTop: "2rem", display: "flex", justifyContent: "flex-start", alignItems: "flex-start", flexDirection: "column"}}>
<Typography variant="h5" mb={2}>{productItem()?.title}</Typography>
<Typography mb={2}>€ {productItem()?.variants[0].prices[0].amount / 100 }</Typography>
<Typography mb={2}>{productItem()?.description}</Typography>
<IconButton>
<Button onClick={handleAddToCart} variant="contained" color="primary">
Add to cart
</Button>
</IconButton>
</Box>
</Grid>
</Grid>
</Container>
</Box>
<Footer />
</>
}
export default SingleProduct;
مرحله 6: ثبت صفحات فروشگاه:
در این بخش از این مقاله، ما قصد داریم تا با استفاده از Solid Router، مسیریابی سمت کلاینت را در برنامه خود فعال کنیم.
index.jsx
نقطه ورود ما است، بنابراین ما وارد خواهیم کرد Router
و جزء App را درون آن قرار دهید.
باز کن index.jsx
و با محتوای زیر جایگزین کنید:
/* @refresh reload */
import { render } from 'solid-js/web';
import { Router } from "@solidjs/router";
import './index.css';
import App from './App';
const root = document.getElementById('root');
if (import.meta.env.DEV && !(root instanceof HTMLElement)) {
throw new Error(
'Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got mispelled?',
);
}
render(() =>
<Router>
<App />
</Router>, root);
خودشه! اکنون می توانید سه صفحه را ثبت کنید. باز کن App.jsx
و با محتوای زیر جایگزین کنید:
import { Routes, Route } from "@solidjs/router"
import { lazy } from "solid-js";
import Header from './component/Header'
const Products = lazy(() => import("./pages/Products"));
const Home = lazy(() => import("./pages/Home"));
const SingleProduct = lazy(() => import("./pages/SingleProduct"));
function App() {
return (
<div>
<Header />
<Routes>
<Route path="/" component={Home} />
<Route path="/products" component={Products} />
<Route path="/products/:productId" component={SingleProduct} />
</Routes>
</div>
);
}
export default App;
مرحله 7: ویترین فروشگاه را تست کنید
سرور خود را مجدداً راه اندازی کنید و یک برگه مرورگر جدید در آن باز کنید http://localhost:8000
و این چیزی است که مرورگر شما باید نمایش دهد:
صفحه نخست:
صفحه محصولات: در نوار ناوبری خود، روی محصولات کلیک کنید تا به صفحه محصولات برسید:
صفحه SingleProducts: برای ورود به صفحه تک محصول بر روی هر یک از محصولات کلیک کنید:
نتیجه
پس از معرفی مدوسا و سالید در این مقاله، نحوه ایجاد یک وب سایت تجارت الکترونیک با استفاده از مدوسا (به عنوان باطن) و سالید (به عنوان ویترین فروشگاه) را از ابتدا نشان دادم.
ارجاع
اسناد مدوسا – https://docs.medusajs.com/introduction
روتر جامد – https://github.com/solidjs/solid-router
رابط کاربری مواد – https://suid.io/getting-started/usage