zoaseo
To Infinity And Beyond
zoaseo
전체 방문자
오늘
어제
  • 분류 전체보기 (763)
    • 개발이 좋아서 (381)
      • SAP가 좋아서 (3)
      • Java가 좋아서 (42)
      • Spring이 좋아서 (50)
      • JPA가 좋아서 (0)
      • QueryDSL이 좋아서 (26)
      • Docker가 좋아서 (7)
      • Redis가 좋아서 (7)
      • AWS가 좋아서 (5)
      • CI/CD가 좋아서 (6)
      • Troubleshooting이 좋아서 (4)
      • Kotlin이 좋아서 (7)
      • SQL이 좋아서 (6)
      • HTTP가 좋아서 (21)
      • JavaScript가 좋아서 (30)
      • TypeScript가 좋아서 (6)
      • Vue가 좋아서 (21)
      • Flutter가 좋아서 (61)
      • React가 좋아서 (20)
      • Redux(React)가 좋아서 (2)
      • Angular가 좋아서 (22)
      • HTML이 좋아서 (9)
      • CSS가 좋아서 (15)
      • PHP가 좋아서 (9)
      • Illustrator가 좋아서 (2)
    • 노력이 좋아서 (169)
    • 결과물이 좋아서 (14)
    • 코딩연습이 좋아서 (168)
      • 이론이 좋아서 (62)
      • SQL이 좋아서 (90)
    • 유용한 사이트가 좋아서 (28)
    • Github (2)

인기 글

티스토리

hELLO · Designed By 정상우.
zoaseo

To Infinity And Beyond

<step69>'react_shoppingmall홈페이지 구현_step1'
노력이 좋아서

<step69>'react_shoppingmall홈페이지 구현_step1'

2022. 6. 29. 16:48

1) 

sass

yarn add nod-sass

antd

npm install antd

axios

npm install axios / yarn add axios

react-router-dom

npm install react-router-dom

 

2) 

App.js

import './App.css';
import Footer from './include/Footer';
import Header from './include/Header';
import MainPage from './main';
import ProductPage from './product';
import { Routes, Route } from 'react-router-dom';
import UploadPage from './upload';

function App() {
  return (
    <div className="App">
      <Header/>
        <Routes>
          <Route path="/" element={<MainPage/>}/>
          <Route path="/products" element={<ProductPage/>}/>
          <Route path="/upload" element={<UploadPage/>}/>
        </Routes>
      <Footer/>
    </div>
  );
}

export default App;

App.css

* { margin: 0; padding: 0; box-sizing: border-box; }
li { list-style: none; }
a { text-decoration: none; color: inherit; }
body { 
    font-family: "나눔고딕", sans-serif;
    font-size: 16px;
    line-height: 1.6;
    color: #222;
}
input, section, textarea {
    outline: none;
}
table { border-collapse: collapse; }
#header {
  height: 64px;
}
.inner {
  width: 1200px;
  margin: 0 auto;
}
#header .inner {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
#header ul {
  display: flex;
}
#header ul li {
  padding: 0 10px;
}
#footer {
  padding-top: 50px;
}
#footer-info {
  border-top: 3px solid #333;
  border-bottom: 1px solid #333;
  padding-bottom: 30px;
}
#footer-info > div {
  display: flex;
  justify-content: space-between;
}
#footer-info > div div {
  width: 32%;
  line-height: 2;
}
#footer-info > div div h3 {
  border-bottom: 1px solid #ccc;
  padding-top: 20px;
  padding-bottom: 10px;
  margin-bottom: 20px;
}
#footer-info > div div li {
  border-bottom: 1px dotted #ccc;
}
#copyright {
  background-color: #eee;
  padding: 30px;
  border-top: 1px solid #ccc;
}
#footer-copy ul {
  display: flex;
  padding: 16px 0;
}
#footer-copy ul li {
  padding: 0 30px;
  line-height: 1;
}
#footer-copy ul li:not(:last-child) {
  border-right: 1px solid #ccc;
}

include

Header.js

import React from 'react';
import { NavLink } from 'react-router-dom';

const Header = () => {
    return (
        <div id="header">
            <div className='inner'>
                <h1><NavLink to="/">램프쇼핑</NavLink></h1>
                <ul>
                    <li><NavLink to="/upload">상품등록하기</NavLink></li>
                    <li><NavLink to="/products">상품보기</NavLink></li>
                </ul>
            </div>
        </div>
    );
};

export default Header;

Footer.js

import React from 'react';

const Footer = () => {
    return (
        <div id="footer">
            <div id="footer-info">
                <div className='inner'>
                    <div>
                        <h3>무통장 입금계좌</h3>
                        <p>BANK ACCOUNT</p>
                        <p>301-1234-5678-01</p>
                        <p>예금주 - 김그린(그린조명)</p>
                    </div>
                    <div>
                        <h3>고객센터</h3>
                        <p>영업시간 이외에는 문의 게시판을 이용해주시면
                            담당자 확인 후 빠른 답변 도와드리겠습니다.
                        </p>
                        <p id="tel">02-126301245</p>
                    </div>
                    <div>
                    <h3>공지사항</h3>
                        <ul>
                            <li>조명가이드 <span>2022-06-20</span></li>
                            <li>신상품 입고 안내 <span>2022-06-10</span></li>
                            <li>몰 오픈을 축하드립니다. <span>2022-02-20</span></li>
                        </ul>
                    </div>
                </div>
            </div>
            <div id="footer-copy">
                <div className='inner'>
                    <ul>
                        <li>홈</li>
                        <li>그린매장안내</li>
                        <li>이용약관</li>
                        <li>개인정보처리방침</li>
                    </ul>
                </div>
                <div id="copyright">
                    <div className='inner'>
                        상호 : 그린조명 주소 : 울산광역시 남구 삼산중로 100번길
                        대표전화 : 국번없이 052-1234-4223 대표이사 : 김그린
                        개인정보관리자 : 이블루 사업자 등록번호 : 102-12-12345
                        copyright(c) Green Lamp,.LTD all rights reserved.
                    </div>
                </div>
            </div>
        </div>
    );
};

export default Footer;

main

index.js

import React from 'react';
import './index.scss';

const MainPage = () => {
    return (
        <div>
            <div id="main">
                <div id="banner">
                    <img src="images/banners/banner1.png" alt=""/>
                </div>
                <div id="product-list" className="inner">
                    <h2>그린조명 최신상품</h2>
                    <div id="product-items">
                        <div className='product-card'>
                            <div className='product-img'>
                                <img src="images/products/product1.jpg" alt="" />
                            </div>
                            <div className='product-contents'>
                                <span className='product-name'>제품명</span>
                                <span className='product-price'>가격</span>
                                <div className='product-seller'>
                                    <img src="images/icons/avatar.png" alt="" />아무나
                                </div>
                            </div>
                        </div>
                        <div className='product-card'>
                            <div className='product-img'>
                                <img src="images/products/product1.jpg" alt="" />
                            </div>
                            <div className='product-contents'>
                                <span className='product-name'>제품명</span>
                                <span className='product-price'>가격</span>
                                <div className='product-seller'>
                                    <img src="images/icons/avatar.png" alt="" />아무나
                                </div>
                            </div>
                        </div>
                        <div className='product-card'>
                            <div className='product-img'>
                                <img src="images/products/product1.jpg" alt="" />
                            </div>
                            <div className='product-contents'>
                                <span className='product-name'>제품명</span>
                                <span className='product-price'>가격</span>
                                <div className='product-seller'>
                                    <img src="images/icons/avatar.png" alt="" />아무나
                                </div>
                            </div>
                        </div>
                        <div className='product-card'>
                            <div className='product-img'>
                                <img src="images/products/product1.jpg" alt="" />
                            </div>
                            <div className='product-contents'>
                                <span className='product-name'>제품명</span>
                                <span className='product-price'>가격</span>
                                <div className='product-seller'>
                                    <img src="images/icons/avatar.png" alt="" />아무나
                                </div>
                            </div>
                        </div>
                        <div className='product-card'>
                            <div className='product-img'>
                                <img src="images/products/product1.jpg" alt="" />
                            </div>
                            <div className='product-contents'>
                                <span className='product-name'>제품명</span>
                                <span className='product-price'>가격</span>
                                <div className='product-seller'>
                                    <img src="images/icons/avatar.png" alt="" />아무나
                                </div>
                            </div>
                        </div>
                        <div className='product-card'>
                            <div className='product-img'>
                                <img src="images/products/product1.jpg" alt="" />
                            </div>
                            <div className='product-contents'>
                                <span className='product-name'>제품명</span>
                                <span className='product-price'>가격</span>
                                <div className='product-seller'>
                                    <img src="images/icons/avatar.png" alt="" />아무나
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    );
};

export default MainPage;

index.scss

#banner {
    img {
        width: 100%;
    }
}
#product-list {
    h2 {
        padding: 30px 0;
    }
    #product-items {
        display: flex;
        flex-wrap: wrap;
        .product-card {
            width: 24%;
            border: 1px solid #ccc;
            border-radius: 16px;
            margin-bottom: 16px;
            overflow: hidden;
            &:not(:nth-child(4n+0)) {
                margin-right: 1.3333%;
            }
            .product-img {
                img {
                    width: 100%;
                }
            }
            .product-contents {
                padding: 24px;
                span {
                    display: block;
                }
                .product-seller {
                    padding-top: 16px;
                    display: flex;
                    align-items: center;
                    img {
                        width: 50px;
                    }
                }
            }
        }
    }
}

product

index.js

import React from 'react';
import "./product.scss";

const ProductPage = () => {
    return (
        <div className='inner'>
            <div id="image-box">
                <img src="images/products/product1.jpg" alt="" />
            </div>
            <div id="profile-box">
                <ul>
                    <li>
                        <div>
                            <img src="images/icons/avatar.png" alt="" />
                            <span>그린</span>
                        </div>
                    </li>
                    <li>
                        제품명 새로운 조명
                    </li>
                    <li>
                        가격 50000원
                    </li>
                    <li>등록일 2022년 6월 2일</li>
                    <li>상세설명 </li>
                </ul>
            </div>
        </div>
    );
};

export default ProductPage;

product.scss

#image-box {
    padding-top: 50px;
    display: flex;
    align-items: center;
    justify-content: center;
    img {
        width: 50%;
        border-radius: 50%;
    }
}
#profile-box {
    padding: 16px;
    margin-top: 10px;
    li {
        border-bottom: 1px solid #ccc;
        line-height: 40px;
        div {
            display: flex;
            align-items: center;
            img {
                width: 70px;
            }
        }
    }
}

upload

index.js

import React from 'react';
import './upload.scss';
import 'antd/dist/antd.css';
import { Form, Divider, Input, InputNumber, Button } from 'antd';

const UploadPage = () => {
    return (
        <div id="upload-container" className='inner'>
            <Form name='productUpload'>
                <Form.Item name="imgUpload"
                    label={<div className='upload-label'>상품사진</div>}
                >
                    <div id="upload-img-placeholder">
                        <img src="images/icons/camera.png" alt="" />
                        <span>이미지를 업로드해주세요.</span>
                    </div>
                </Form.Item>
                <Divider/>
                <Form.Item name="seller"
                label={<div className='upload-label'>판매자명</div>}>
                    <Input className='nameUpload' size='large'
                    placeholder='판매자 이름을 입력하세요'/>
                </Form.Item>
                <Divider/>
                <Form.Item name="name"
                label={<div className='upload-label'>상품이름</div>}>
                    <Input
                        className='upload-name'
                        size='large'
                        placeholder='상품이름을 입력해주세요'
                    />
                </Form.Item>
                <Divider/>
                <Form.Item name="price"
                label={<div className='upload-label'>상품가격</div>}>
                    <InputNumber defaultValue={0} size="large"/>
                </Form.Item>
                <Divider/>
                <Form.Item name="description"
                    label={<div className='upload-label'>상품소개</div>}
                >
                    <Input.TextArea
                        size='large'
                        id="product-description"
                        maxLength={300}
                        placeholder="상품 소개를 적어주세요"
                    />
                </Form.Item>
                <Form.Item>
                    <Button id='submit-button' size='large' htmlType='submit'>
                        상품등록하기
                    </Button>
                </Form.Item>
            </Form>
        </div>
    );
};

export default UploadPage;

upload.scss

#upload-img-placeholder {
    width: 200px;
    height: 200px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    border: 1px solid rgb(230,230,230);
    background: rgb(250,250,253);
    margin-left: 16px;
}
#upload-img-placeholder > img {
    width: 50px;
    height: 50px;
}
#upload-img-placeholder > span {
    font-size: 14px;
    color: rgb(195,194,204);
}
.upload-label {
    width: 200px;
    font-size: 18px;
    text-align: left;
}

'노력이 좋아서' 카테고리의 다른 글

<step70>'react_shoppingmall홈페이지 구현_step2'  (0) 2022.06.30
<step70>'js_동기비동기_promise,async,await'  (0) 2022.06.30
<step69>'react_axios2'  (0) 2022.06.29
<step69>'react_axios'  (0) 2022.06.28
<step69>'react_router'  (0) 2022.06.28

    티스토리툴바