Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[강수정] sprint 5 #98

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
70 changes: 56 additions & 14 deletions .github/pull-request-template.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,68 @@

### 기본

- [x]
- []
- []
# 스프린트 미션 1 시안 확인

### 심화
- [ ] React와 같은 UI 라이브러리를 사용하지 않고 진행합니다.
- [ ] PC사이즈만 고려해 주어진 디자인으로 구현합니다.
- [ ] HTML, CSS 파일을 Netlify로 배포해 주세요. (참고: https://magenta-starburst-b50dbf.netlify.app)
- [ ] 랜딩 페이지의 url path는 루트(‘/’)로 설정합니다.
- [ ] title은 “판다마켓”로 설정합니다.
- [ ] “판다마켓” 로고 클릭 시 루트 페이지(‘/’)로 이동합니다.
- [ ] '로그인' 버튼 클릭 시 로그인 페이지(‘/login’)로 이동합니다 (빈 페이지)
- [ ] “구경하러 가기”버튼 클릭 시(’/items’)로 이동합니다. (빈 페이지)
- [ ] “Privacy Policy”, “FAQ”는 클릭 시 각각 Privacy 페이지(‘/privacy’), FAQ 페이지(‘/faq’)로 이동합니다.(모두 빈 페이지)
- [ ] 페이스북, 트위터, 유튜브, 인스타그램 아이콘을 클릭 시 각각의 홈페이지로 새로운 창이 열리면서 이동합니다.
- [ ] 아래로 스크롤해도 “판다 마켓” 로고와 “로그인” 버튼이 있는 상단 내비게이션 바(Global Navigation Bar)가 최상단에 고정되게 해 주세요.
- [ ] 화면의 너비가 1920px 이상이면 하늘색 배경색은 너비를 꽉 채우도록 채워지고, 내부 요소들의 위치는 고정되고, 여백만 커지도록 합니다.
- [ ]화면의 너비가 1920px 보다 작아질 때, “판다마켓” 로고의 왼쪽 여백 200px, “로그인" 버튼의 오른쪽 여백 200px이 유지되고, 화면의 너비가 작아질수록 두 요소 간 거리가 가까워지도록 설정합니다.
- [ ] 화면의 너비가 1920px 이상이면 내부에 있는 요소 간 동일한 간격을 유지하며 가운데 정렬해야 합니다.
- [ ] 화면의 너비가 1920px 보다 작아질 때, 최하단에 있는 “codeit-2024”의 왼쪽 여백 200px과 SNS 아이콘들의 오른쪽 여백 200px을 유지하면서 가운데 있는 “Privacy Policy”, “FAQ” 요소와 각각 동일한 간격을 유지하며 가까워져야 합니다.
- [ ] 클릭으로 기능이 동작해야 하는 경우, 사용자가 클릭할 수 있는 요소임을 알 수 있도록 CSS 속성 cursor: pointer로 설정합니다.

- [x]
- []
# 스프린트 미션 2 시안 확인

## 주요 변경사항
- [ ] README.md 파일을 작성해 주세요.
- [ ] 마크다운 언어를 숙지하여 작성해 주세요.
- [ ] 내용은 자유롭게 작성해 주세요.
- [ ] 본인 브랜치(ex)part1-홍길동)에 스프린트 미션을 업로드해 주세요.
- [ ] 적절한 커밋 메시지를 남겨 주세요.
- [ ] 1-Sprint-Mission 레포지토리를 fork 합니다.
- [ ] GitHub에 PR(Pull Request)을 생성해 upstream의 본인 브랜치(ex)part1-홍길동)에 미션을 제출합니다.
- [ ] PR 코멘트에 아래 내용들을 포함해 주세요.
- [ ] 스프린트 미션 요구사항 체크리스트
- [ ] 아래 예시 사진과 같이 완료한 만큼 체크 표시를 해 주세요. 참고
- [ ] 주요 변경사항
- [ ] 멘토님에게 남길 메시지
- [ ] Git 활용 과정에서 유닉스 커맨드를 활용해 주세요.
- [ ] HTML, CSS 파일을 Netlify로 배포합니다. (참고: https://www.codeit.kr/learn/5309)

-
-
로그인 페이지, 회원가입 페이지 공통

## 스크린샷
- [ ]“판다마켓" 로고 클릭 시 루트 페이지(“/”)로 이동합니다.
- [ ]로그인 페이지, 회원가입 페이지 모두 로고 위 상단 여백이 동일합니다.
- [ ]SNS 아이콘들은 클릭 시 각각 “https://www.google.com/”, “https://www.kakaocorp.com/page/” 으로 이동합니다.
- [ ]input 요소에 focus in 일 때, 테두리 색상은 ##3692FF입니다.
- [ ]input 요소에 focus out 일 때, 테두리는 없습니다.
로그인 페이지

- [ ]“회원가입”버튼 클릭 시 “/signup” 페이지로 이동합니다.
회원가입 페이지
- [ ]“로그인”버튼 클릭 시 “/login” 페이지로 이동합니다


### 심화 요구사항
공통

- [ ] reset.css를 설정해 주세요.
- [ ] 사용자의 브라우저 설정에 따라 기본 폰트 크기 설정이 변화함에 따라서 페이지의 요소 간 간격, 요소의 크기, font-size 등 모든 크기와 관련된 값이 크고 작아지도록 설정해 주세요.
이번 레슨은 어땠나요?
- [ ]palette에 있는 color값들을 css 변수로 등록해서 사용합니다.
- [ ]구글 애널리틱스로 방문자 수 확인하기 할 수 있도록 설정합니다.
로그인 페이지, 회원가입 페이지 공통
- [ ]비밀번호, 비밀번호 확인 input 요소 오른쪽에 비밀번호를 확인할 수 있는 눈 모양 아이콘을 추가합니다.

![image](이미지url)

## 멘토에게

-
-
- 셀프 코드 리뷰를 통해 질문 이어가겠습니다.
- 잘 부탁드립니다.
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"liveServer.settings.port": 5501
}
Binary file added 판다마켓/.DS_Store
Binary file not shown.
19 changes: 19 additions & 0 deletions 판다마켓/api/common/common.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
export function responseInterceptor (response) {
if(response.status === 200 || response.status === 201 || response.status === 204) {
console.log('성공')
return response.json().then((res) => ({ isSuccess : true, status : response.status, data:res }));
} else {
console.log('실패')
return response.json().then((res) => ({ isSuccess : false, status : response.status, data:res }));
}

// return response.json().then((res) => ({ isSuccess :
// response.status === 200 || response.status === 201 || response.status === 204
// , status : response.status, data:res }));
}

export function handleError (error) {
console.log(error)
throw errors
}

3 changes: 3 additions & 0 deletions 판다마켓/api/common/constant.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@


export const apiUrl = "https://sprint-mission-api.vercel.app"
41 changes: 41 additions & 0 deletions 판다마켓/api/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { ArticleService } from "./services/ArticleService.js";
import { ProductService } from "./services/ProductService.js";




//articleservice
const getArticleList = await ArticleService.getArticleList(1, 10, "aa")
console.log(getArticleList)

const getArticle = await ArticleService.getArticle(2)
console.log(getArticle)

const createArticle = await ArticleService.createArticle('제목','내용2','sdf.jpg')
console.log(createArticle)

const patchArticle = await ArticleService.patchArticle('aaa','제목','내용2','sdf.jpg')
console.log(patchArticle)

const deleteArticle = await ArticleService.deleteArticle(764)
console.log(deleteArticle)




//productservice
const getProductList = await ProductService.getProductList(2, 2, "수정")
console.log(getProductList)

const getProduct = await ProductService.getProduct(2)
console.log(getProduct)

const createProduct = await ProductService.createProduct('수정','dd',123,'a',['asf'],['sef.jpg'])
console.log(createProduct)

const patchProduct = await ProductService.patchProduct(80, '수정', 'fff', '333', 'aaa', ['ssf'],['asf.jpg'])
console.log(patchProduct)

const deleteProduct = await ProductService.deleteProduct(370)
console.log(deleteProduct)

3 changes: 3 additions & 0 deletions 판다마켓/api/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"type" : "module"
}
98 changes: 98 additions & 0 deletions 판다마켓/api/services/ArticleService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
import { responseInterceptor, handleError } from "../common/common.js";
import { apiUrl } from "../common/constant.js";

/**
* 게시글 목록 조회
*
* @param page 페이지
* @param pageSize 페이지당 몇개 올 지
* @param keyword 키워드
*/
function getArticleList(page, pageSize, keyword){
return fetch(`${apiUrl}/articles?page=${page}&pageSize=${pageSize}&keyword=${keyword}`)
.then((response) => responseInterceptor(response))
.catch((error) => handleError(error))
}

async function getArticle(id){

return fetch(`https://sprint-mission-api.vercel.app/articles/${id}`, {
method : 'GET',
headers : {
'Content-Type' : 'application/json',
}
})
.then((response) => responseInterceptor(response))
.catch((error) => handleError(error))

// .then(function(response){
// return responseInterceptor(response)
// })


}

/**
* 게시글생성
*
* @param title 제목
* @param content 내용
* @param img 이미지 링크
*/
function createArticle(title, content, img) {

if (!title || !content || !img) return false;
const requestBody = {
title : title,
content : content,
image : img
}
return fetch('https://sprint-mission-api.vercel.app/articles', {
method : 'POST',
body : JSON.stringify(requestBody),
headers : {
'Content-Type' : 'application/json',
}
})
.then((response) => responseInterceptor(response))
.catch((error) => handleError(error))
}

function patchArticle(id, title, content, img) {
const requestBody = {
title : title,
content : content,
image : img
}

return fetch(`https://sprint-mission-api.vercel.app/articles/${id}`, {
method : 'PATCH',
body : JSON.stringify(requestBody),
headers : {
'Content-Type' : 'application/json',
}
})
.then((response) => responseInterceptor(response))
.catch((error) => handleError(error))

}

function deleteArticle(id) {
return fetch(`https://sprint-mission-api.vercel.app/articles/${id}`, {
method : 'DELETE',
headers : {
'Content-Type' : 'application/json',
},
})
.then((response) => responseInterceptor(response))
.catch((error) => handleError(error))
}

export const ArticleService = {
getArticleList,
getArticle,
createArticle,
patchArticle,
deleteArticle
}

136 changes: 136 additions & 0 deletions 판다마켓/api/services/ProductService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
// import { responseInterceptor, handleError } from "../common/common.js";
import { apiUrl } from "../common/constant.js";



async function getProductList(page, pageSize, keyword){
try {

const requestBody = {
page : page,
pageSize : pageSize,
keyword : keyword
}

const response = await fetch(`${apiUrl}/products?page=${page}&pageSize=${pageSize}&keyword=${keyword}`)
const data = await response.json()

if(response.status === 200 || response.status === 201 || response.status === 204) {
console.log('성공')
}
return {
isSuccess : true,
status : response.status,
data : data
}
} catch(err) {
console.log('이게 에러임', err)
return "err catch"
}
}

async function getProduct(id){
try{
const response = await fetch(`${apiUrl}/products/${id}`)

const data = await response.json()
return {
isSuccess : true,
status : response.status,
data : data
}
} catch(err) {
console.log('이게 에러임', err)
return "err catch"
}
}

async function createProduct(name, description, price, manufacturer, tags, images){
try{
const requestBody = {
name : name,
description : description,
price : price,
manufacturer : manufacturer,
tags: tags,
images: images
}

const response = await fetch(`${apiUrl}/products`, {
method : 'POST',
body : JSON.stringify(requestBody),
headers : {
'Content-Type' : 'application/json',
}
})

const data = await response.json()
return {
isSuccess : true,
status : response.status,
data : data
}
} catch(err) {
console.log('이게 에러임', err)
return "err catch"
}
}

async function patchProduct(id, name, description, price, tags, images){
try{
const requestBody = {
"name": name,
"description": description,
"price": price,
"tags": tags,
"images": images
}

const response = await fetch(`${apiUrl}/products/${id}`,{
method : 'PATCH',
body : JSON.stringify(requestBody),
headers : {
'Content-Type' : 'application/json',
}
})
const data = await response.json()
return {
isSuccess : true,
status : response.status,
data : data
}
} catch(err) {
console.log('이게 에러임', err)
return "err catch"
}
}

async function deleteProduct(id){
const response = await fetch(`${apiUrl}/products/${id}`, {
method : 'DELETE',
headers : {
'Content-Type' : 'application/json',
}
})
if (response.status === 204) {
return {
isSuccess : true,
status : response.status,
data : null
}
} else {
return {
isSuccess : false,
status : response.status,
data : null
}
}
}

export const ProductService = {
getProductList,
getProduct,
createProduct,
patchProduct,
deleteProduct
}
Binary file added 판다마켓/img/.DS_Store
Binary file not shown.
Binary file added 판다마켓/img/Component 2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added 판다마켓/img/Component 3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added 판다마켓/img/Group 19.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added 판다마켓/img/Vector.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added 판다마켓/img/bottom-banner-image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added 판다마켓/img/btn_hidden.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading