Hot item
+
+ 인기 상품을
+
+ 확인해 보세요
+
+
+ 가장 HOT한 중고거래 물품을
+
+ 판 마켓에서 확인해 보세요
+
diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..1cc333b
Binary files /dev/null and b/.DS_Store differ
diff --git a/ArticleService.mjs b/ArticleService.mjs
new file mode 100644
index 0000000..9acd395
--- /dev/null
+++ b/ArticleService.mjs
@@ -0,0 +1,108 @@
+const BASE_URL = 'https://panda-market-api-crud.vercel.app';
+
+export const getArticleList = ({
+ page = 1,
+ pageSize = 10,
+ keyword = '',
+} = {}) => {
+ const url = `${BASE_URL}/articles?page=${page}&pageSize=${pageSize}&keyword=${keyword}`;
+
+ return fetch(url)
+ .then((response) => {
+ if (!response.ok) {
+ throw new Error(`목록 조회 실패! Status: ${response.status}`);
+ }
+ return response.json();
+ })
+ .then((data) => {
+ console.log('ArticleList:', data);
+ return data;
+ })
+ .catch((error) => {
+ console.error(error);
+ throw error;
+ });
+};
+
+export const getArticle = (articleId) => {
+ return fetch(`${BASE_URL}/articles/${articleId}`)
+ .then((response) => {
+ if (!response.ok) {
+ throw new Error(`ID 조회 실패! Status: ${response.status}`);
+ }
+ return response.json();
+ })
+ .then((data) => {
+ console.log(`the Article:`, data);
+ return data;
+ })
+ .catch((error) => {
+ console.error(error);
+ throw error;
+ });
+};
+
+export const createArticle = ({ title, content, image } = {}) => {
+ return fetch(`${BASE_URL}/articles`, {
+ method: 'POST',
+ body: JSON.stringify({ title, content, image }),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+ .then((response) => {
+ if (!response.ok) {
+ throw new Error(`생성 실패! Status: ${response.status}`);
+ }
+ return response.json();
+ })
+ .then((data) => {
+ console.log(`posted Article:`, data);
+ return data;
+ })
+ .catch((error) => {
+ console.error(error);
+ throw error;
+ });
+};
+
+export const patchArticle = (articleId, { title, content, image } = {}) => {
+ return fetch(`${BASE_URL}/articles/${articleId}`, {
+ method: 'PATCH',
+ body: JSON.stringify({ title, content, image }),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+ .then((response) => {
+ if (!response.ok) {
+ throw new Error(`수정 실패! Status: ${response.status}`);
+ }
+ return response.json();
+ })
+ .then((data) => {
+ console.log(`patched Article:`, data);
+ return data;
+ })
+ .catch((error) => {
+ console.error(error);
+ throw error;
+ });
+};
+
+export const deleteArticle = (articleId) => {
+ return fetch(`${BASE_URL}/articles/${articleId}`, {
+ method: 'DELETE',
+ })
+ .then((response) => {
+ if (!response.ok) {
+ throw new Error(`삭제 실패! Status: ${response.status}`);
+ }
+ console.log(`deleted Article ID: ${articleId}`);
+ return true;
+ })
+ .catch((error) => {
+ console.error(error);
+ throw error;
+ });
+};
diff --git a/ProductService.mjs b/ProductService.mjs
new file mode 100644
index 0000000..21a80eb
--- /dev/null
+++ b/ProductService.mjs
@@ -0,0 +1,114 @@
+const BASE_URL = 'https://panda-market-api-crud.vercel.app';
+
+export const getProductList = async ({
+ page = 1,
+ pageSize = 10,
+ keyword = '',
+} = {}) => {
+ try {
+ const url = `${BASE_URL}/products?page=${page}&pageSize=${pageSize}&keyword=${keyword}`;
+
+ const response = await fetch(url);
+
+ if (!response.ok) {
+ throw new Error(`목록 조회 실패! Status: ${response.status}`);
+ }
+
+ const data = await response.json();
+
+ console.log('ProductList:', data);
+ return data;
+ } catch (error) {
+ console.error(error);
+ throw error;
+ }
+};
+
+export const getProduct = async (productId) => {
+ try {
+ const response = await fetch(`${BASE_URL}/products/${productId}`);
+
+ if (!response.ok) {
+ throw new Error(`ID 조회 실패! Status: ${response.status}`);
+ }
+
+ const data = await response.json();
+
+ console.log(`the Product:`, data);
+ return data;
+ } catch (error) {
+ console.error(error);
+ throw error;
+ }
+};
+
+export const createProduct = async ({
+ name,
+ description,
+ price,
+ tags,
+ images,
+} = {}) => {
+ try {
+ const response = await fetch(`${BASE_URL}/products`, {
+ method: 'POST',
+ body: JSON.stringify({ name, description, price, tags, images }),
+ headers: { 'Content-Type': 'application/json' },
+ });
+
+ if (!response.ok) {
+ throw new Error(`생성 실패! Status: ${response.status}`);
+ }
+
+ const data = await response.json();
+
+ console.log(`posted Product:`, data);
+ return data;
+ } catch (error) {
+ console.error(error);
+ throw error;
+ }
+};
+
+export const patchProduct = async (
+ productId,
+ { name, description, price, tags, images } = {}
+) => {
+ try {
+ const response = await fetch(`${BASE_URL}/products/${productId}`, {
+ method: 'PATCH',
+ body: JSON.stringify({ name, description, price, tags, images }),
+ headers: { 'Content-Type': 'application/json' },
+ });
+
+ if (!response.ok) {
+ throw new Error(`수정 실패! Status: ${response.status}`);
+ }
+
+ const data = await response.json();
+
+ console.log(`patched Product:`, data);
+ return data;
+ } catch (error) {
+ console.error(error);
+ throw error;
+ }
+};
+
+export const deleteProduct = async (productId) => {
+ try {
+ const response = await fetch(`${BASE_URL}/products/${productId}`, {
+ method: 'DELETE',
+ });
+
+ if (!response.ok) {
+ throw new Error(`삭제 실패! Status: ${response.status}`);
+ }
+
+ console.log(`deleted Product ID: ${productId}`);
+ return true;
+ } catch (error) {
+ console.error(error);
+ throw error;
+ }
+};
diff --git a/README.md b/README.md
index 99b72d9..cde2cb1 100644
--- a/README.md
+++ b/README.md
@@ -1,50 +1,52 @@
-# 🐼 판다마켓 프로젝트
+# 📝 [판다마켓 웹페이지(스프린트 미션)]
-> _이 저장소는 판다마켓 프로젝트의 프론트엔드 코드를 관리하는 곳입니다. 프로젝트를 클론하여 개발 환경을 설정하고, 각 브랜치에서 해당 스프린트 미션을 수행해 주세요!_ 🛠️
+
+
+**한 줄 소개**: 거래사이트 "판다마켓"의 웹페이지를 만듭니다.
-## 소개
+
-안녕하세요! 판다마켓 프로젝트에 오신 것을 환영합니다! 🥳
-판다마켓은 따뜻한 중고거래를 위한 커뮤니티 플랫폼이에요. 여러분은 이곳에서 상품을 등록하고, 다른 사용자들과 소통하며, 자유롭게 이야기를 나눌 수 있어요. 매주 스프린트 미션을 통해 기능을 하나씩 만들어 가며 성장해 나가는 여정을 함께해요. 🚀
+
+## 🔗 배포 링크 (v2.2.1)
+👉 [웹사이트 보러가기](https://sprint-project-min.netlify.app/)
-
-_위 이미지는 판다마켓의 대표 이미지입니다._ 📸
+
-## 스프린트 미션이란? 🤔
+## 💡 프로젝트 소개 (Description)
+**어떤 웹사이트인가요?**
+이 프로젝트는 웹 개발 학습을 위해 제작되었습니다. 스프린트 과제를 수행하며 코딩실력을 향상시키는데 도움이 될 것입니다. ```VS code, Git, Figma``` 등 다양한 도구와 ```netfliy``` 등의 사이트를 통해 코드작성, 디자인, 공유 및 배포의 과정을 익힐 것입니다. 초반에는 ```html/ css/ javascript``` 등의 개발에 필요한 기본 스택을 익히며 나중에는 ```react/ express``` 등을 배우고 활용할 것입니다.
-스프린트 미션은 **하나의 개인 프로젝트를 길게 진행하면서, 그 과정에서 주기적으로 피드백을 받을 수 있는 시스템**이에요. 각 스프린트마다 배운 이론을 적용해 보고, **멘토님께 코드 리뷰를 받아가며 실력을 쑥쑥 키워갈 수 있는 중요한 개인 과제**랍니다. 💪
+**개발 기간**
+* 2025.12.01 ~ 게속
-## 주요 기능 ✨
+
-1. **상품 등록**: 내가 가진 물건을 올리고, 사진과 설명을 추가해 직접 판매할 수 있어요!
-2. **문의 댓글**: 상품에 대한 궁금한 점이나 의견을 자유롭게 남길 수 있답니다. 📝
-3. **자유게시판**: 다양한 주제로 친구들과 이야기를 나누고, 정보를 공유할 수 있는 공간이에요! 🗣️
+## 🛠 기술 스택 (Tech Stack)
-## 프로젝트 브랜치 구조 🏗️
+| 분류 | 기술 |
+| :-- | :-- |
+| **Frontend** |   |
+| **Backend** |  |
+| **Styling** ||
+| **Tools** |  |
-프로젝트는 단계별로 나뉘어 있고, 각 스프린트 미션에 맞는 브랜치가 있어요. 각 브랜치를 통해 체계적으로 개발하며 학습할 수 있어요. 🎯
+
-### 브랜치 설명
+## ✨ 주요 기능 (Key Features)
+* ✅ **기능 1**: 각 페이지 작성 및 디자인
+* ✅ **기능 2**: 링크를 통한 페이지 연결
+* ✅ **기능 3**: github를 활용한 공유
-1. **basic (part1): 스프린트 미션 1 ~ 4 FE 요구사항**
+
- - 기본적인 웹 애플리케이션 기능 구현을 위한 초기 브랜치입니다. HTML, CSS, JavaScript 등을 사용해 기본을 다집니다.
- - **스프린트 미션 1부터 4까지**의 프론트엔드 내용을 포함하고 있어요.
+## 📸 스크린샷 (Screenshots)
+| 메인 화면 | 기능 화면 |
+| :--: | :--: |
+|  |  |
+
-2. **react (part2): 스프린트 미션 5 ~ 7 FE 요구사항**
+## 💻 실행 방법 (Installation)
+이 프로젝트를 로컬 컴퓨터에서 실행하려면 터미널에 아래 명령어를 입력하세요.
- - React 라이브러리를 사용해 프론트엔드 기능을 구현하는 브랜치입니다. 컴포넌트 기반 아키텍처와 상태 관리를 배웁니다.
- - **스프린트 미션 5부터 7까지, 그 이후**의 프론트엔드 내용을 포함하고 있어요.
- - 만약 스프린트 미션 9부터 프론트엔드 코드를 Next가 아닌 React로 구현하고 싶다면 react 브랜치를 사용해요.
-
-3. **next (part3,4): 스프린트 미션 8 FE 요구사항~**
-
- - Next.js를 사용해 서버 사이드 렌더링(SSR)과 정적 사이트 생성(SSG) 등 고급 기능을 구현합니다.
- - **스프린트 미션 8부터** 시작하는 프론트엔드 내용을 포함하고 있어요.
- - 만약 스프린트 미션 9부터 프론트엔드 코드를 React가 아닌 Next로 구현하고 싶다면 next 브랜치를 사용해요.
-
-> _스프린트 미션 내 백엔드 요구사항은 [백엔드 레포지토리](https://github.com/codeit-sprint-fullstack/11-sprint-mission-be)의 브랜치에서 관리해주세요_
-
----
-
-본 프로젝트는 [코드잇](https://www.codeit.kr)의 소유이며, 교육 목적으로만 사용됩니다. © 2025 Codeit. All rights reserved.
+```bash
+git clone https://github.com/alstjddl0513-sys/11-sprint-mission-fe.git
diff --git a/css/login.css b/css/login.css
new file mode 100644
index 0000000..d9ec8b8
--- /dev/null
+++ b/css/login.css
@@ -0,0 +1,127 @@
+* {
+ box-sizing: border-box;
+}
+
+:root {
+ --primary-100: #3692ff;
+ --cool-gray-100: #f3f4f6;
+ --secondry-800: #1f2937;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'pretendard', sans-serif;
+ font-style: normal;
+ white-space: nowrap;
+ display: flex;
+ width: 100%;
+ padding: 23.1rem 64rem 28.4rem;
+ justify-content: center;
+ align-items: center;
+}
+
+body#signup_page {
+ padding: 0.6rem 64rem 17.8rem;
+}
+
+main {
+ display: flex;
+ width: 64rem;
+ flex-direction: column;
+ align-items: center;
+ flex-shrink: 0;
+}
+
+a #logo {
+ width: 39.6rem;
+ height: 13.2rem;
+ margin-bottom: 4rem;
+}
+
+.forms,
+form {
+ display: flex;
+ flex-direction: column;
+ gap: 2.4rem;
+ width: 100%;
+}
+
+.inputs input {
+ width: 100%;
+ margin-top: 1.6rem;
+ padding: 1.6rem 2.4rem;
+ border: 0rem;
+ border-radius: 1.2rem;
+ background-color: var(--cool-gray-100);
+}
+
+.inputs label {
+ color: var(--secondry-800);
+ font-size: 1.8rem;
+ font-weight: 700;
+ line-height: 2.6rem;
+}
+
+input:focus {
+ border: 0.1rem solid var(--primary-100);
+}
+
+.login-button {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 5.6rem;
+ padding: 1.6rem 12.4rem;
+ border-radius: 4rem;
+ background-color: #9ca3af;
+ color: var(--cool-gray-100);
+ font-size: 2rem;
+ font-weight: 600;
+ line-height: 3.2rem;
+ cursor: pointer;
+}
+
+.login-button:hover {
+ background-color: var(--primary-100);
+}
+
+h1 {
+ color: var(--secondry-800);
+ font-size: 1.6rem;
+ font-weight: 500;
+ line-height: 2.6rem;
+}
+
+.easy-login {
+ width: 100%;
+ padding: 1.6rem 2.3rem;
+ margin: 2.4rem 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ border-radius: 0.8rem;
+ background-color: #e6f2ff;
+}
+
+.icons {
+ display: flex;
+ gap: 1.6rem;
+}
+
+.signup {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 0.4rem;
+ color: var(--secondry-800);
+ font-size: 1.4rem;
+ font-weight: 500;
+ line-height: 2.4rem;
+}
+
+.signup a {
+ color: var(--primary-100);
+}
diff --git a/css/reset.css b/css/reset.css
new file mode 100644
index 0000000..45a05ec
--- /dev/null
+++ b/css/reset.css
@@ -0,0 +1,129 @@
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html,
+body,
+div,
+span,
+applet,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+a,
+abbr,
+acronym,
+address,
+big,
+cite,
+code,
+del,
+dfn,
+em,
+img,
+ins,
+kbd,
+q,
+s,
+samp,
+small,
+strike,
+strong,
+sub,
+sup,
+tt,
+var,
+b,
+u,
+i,
+center,
+dl,
+dt,
+dd,
+ol,
+ul,
+li,
+fieldset,
+form,
+label,
+legend,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td,
+article,
+aside,
+canvas,
+details,
+embed,
+figure,
+figcaption,
+footer,
+header,
+hgroup,
+menu,
+nav,
+output,
+ruby,
+section,
+summary,
+time,
+mark,
+audio,
+video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section {
+ display: block;
+}
+body {
+ line-height: 1;
+}
+ol,
+ul {
+ list-style: none;
+}
+blockquote,
+q {
+ quotes: none;
+}
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+ content: "";
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
diff --git a/css/style.css b/css/style.css
new file mode 100644
index 0000000..82c2307
--- /dev/null
+++ b/css/style.css
@@ -0,0 +1,217 @@
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: "pretendard", sans-serif;
+ font-style: normal;
+ width: 100%;
+ white-space: nowrap;
+}
+
+main {
+ background-color: #fcfcfc;
+ width: 100%;
+}
+
+a {
+ text-decoration: none;
+ cursor: pointer;
+}
+
+header {
+ padding: 0.9rem 20rem;
+ width: 100%;
+ height: 7rem;
+ border-bottom: 0.1rem solid #dfdfdf;
+ background-color: #ffffff;
+ position: sticky;
+ top: 0;
+}
+
+.container {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.button {
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+ background-color: #3692ff;
+ font-weight: 600;
+ gap: 1rem;
+}
+
+#login-button {
+ width: 12.8rem;
+ height: 4.8rem;
+ padding: 1.2rem 2.3rem;
+ border-radius: 0.8rem;
+ color: #f3f4f6;
+ font-size: 1.6rem;
+ line-height: 2.6rem;
+}
+
+#look-button {
+ width: 100%;
+ height: 5.6rem;
+ padding: 1.6rem 12.4rem;
+ border-radius: 4rem;
+ color: #f9fafb;
+ font-size: 2rem;
+ line-height: 3.2rem;
+}
+
+h1 {
+ color: #374151;
+ font-size: 4rem;
+ font-weight: 700;
+ line-height: 140%;
+}
+
+h1.sum {
+ letter-spacing: 0.08rem;
+}
+
+.feature {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: 13.8rem 34.4rem;
+ background-color: #ffffff;
+}
+
+.content {
+ width: 98.8rem;
+ display: flex;
+ gap: 6.4rem;
+ justify-content: center;
+ align-items: center;
+}
+
+.section-img {
+ width: 58.8rem;
+ height: 44.4rem;
+ flex-shrink: 0;
+}
+
+.description {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 1.2rem;
+}
+
+.tag {
+ color: #3692ff;
+ font-size: 1.8rem;
+ font-weight: 700;
+ line-height: 2.6rem;
+}
+
+p {
+ margin-top: 1.2rem;
+ color: #374151;
+ font-size: 2.4rem;
+ font-weight: 500;
+ line-height: 3.2rem;
+}
+
+footer {
+ width: 100%;
+ height: 16rem;
+ padding: 3.2rem 20rem;
+ background-color: #111827;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+}
+
+.foot {
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-size: 1.6rem;
+ font-weight: 400;
+ text-align: center;
+}
+
+.foot a {
+ color: #e5e7eb;
+}
+
+.codeit-foot {
+ color: #9ca3af;
+}
+
+.footermenu {
+ display: flex;
+ align-items: flex-start;
+ gap: 3rem;
+}
+
+.social-site {
+ display: flex;
+ align-items: center;
+ width: 11.6rem;
+ gap: 1.2rem;
+}
+
+.imgs {
+ width: 74.6rem;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: cover;
+ display: flex;
+ flex-shrink: 0;
+}
+
+#img2.imgs {
+ height: 39.7rem;
+ background-image: url(/images/Img_home_bottom.svg);
+}
+
+#img1.imgs {
+ height: 34rem;
+ background-image: url(/images/Img_home_top.svg);
+}
+
+.cont {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+#bottom .cont {
+ gap: 6.9rem;
+}
+
+#top .cont {
+ gap: 0.7rem;
+}
+
+.banner {
+ display: flex;
+ flex-direction: column;
+ gap: 3.2rem;
+ padding-bottom: 6rem;
+}
+
+#bottom.banners {
+ margin-top: 13.8rem;
+}
+
+.banners {
+ display: flex;
+ justify-content: center;
+ align-items: flex-end;
+ height: 54rem;
+ background-color: #cfe5ff;
+}
\ No newline at end of file
diff --git a/faq.html b/faq.html
new file mode 100644
index 0000000..7f45731
--- /dev/null
+++ b/faq.html
@@ -0,0 +1,19 @@
+
+
+
+ 가장 HOT한 중고거래 물품을
+
+ 판 마켓에서 확인해 보세요
+
+ 구매하고 싶은 물품은 검색해서
+
+ 쉽게 찾아보세요
+
+ 어떤 물건이든 판매하고 싶은 상품을
+
+ 쉽게 등록하세요
+