-
Notifications
You must be signed in to change notification settings - Fork 1
파이널 코딩 테스트 1번 문제 - 정글 시네마 - 병민 #19
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
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. | ||
|
|
||
| # dependencies | ||
| /node_modules | ||
| /.pnp | ||
| .pnp.js | ||
|
|
||
| # testing | ||
| /coverage | ||
|
|
||
| # production | ||
| /build | ||
|
|
||
| # misc | ||
| .DS_Store | ||
| .env.local | ||
| .env.development.local | ||
| .env.test.local | ||
| .env.production.local | ||
|
|
||
| npm-debug.log* | ||
| yarn-debug.log* | ||
| yarn-error.log* |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,28 +1,37 @@ | ||
| # 멋쟁이사자처럼 프론트엔드 스쿨 7기 - 코드리뷰 스터디 | ||
| <h1> 제주코딩베이스캠프 파이널 코딩테스트 정글 시네마 </h1> | ||
|
|
||
| ## 🛠 Branch name 컨벤션 | ||
|
|
||
| **branch 목록을 볼 때 가독성을 위하여 컨벤션을 지정합니다.** | ||
|
|
||
| ``` | ||
| branch 이름은 '이슈 번호-본인 이름' 으로 작성합니다. | ||
| 본인 이름은 카멜 케이스로 작성합니다. | ||
| 카멜 케이스 | ||
| - 첫 글자는 소문자 | ||
| - 중간 글자는 대문자 | ||
| 예시) 1-byeongMin | ||
| ``` | ||
|
|
||
| ## ⭐️ Pull request title 컨벤션 | ||
| ## 💡 프로젝트 실행 방법 | ||
|
|
||
| ``` | ||
| pull request의 제목은 '이슈 이름-본인 이름' 으로 작성합니다. | ||
| 예시) 구현 과제 - 로그인/회원가입 모달 - 병민 | ||
| git clone https://github.com/merrybmc/jungleCinema.git | ||
| npm install | ||
| npm start | ||
| ``` | ||
| <br/> | ||
|
|
||
| ## ✏ Commit 컨벤션 | ||
| ## 📌 배포 링크 | ||
| http://junglecinema.s3-website-us-east-1.amazonaws.com/ | ||
| <br /> | ||
| <br /> | ||
|
|
||
| ## 📜 폴더 구조 | ||
| ``` | ||
| Commit을 할 때 '[이슈 번호] 구현 내용' 으로 작성합니다. | ||
| 예시) [#1] 로그인 모달 및 기능 구현 | ||
| 📄 src | ||
| ├── components | ||
| │ ├── footer | ||
| │ │ ├── footer.jsx | ||
| │ │ └── footer.scss | ||
| │ ├── main | ||
| │ │ ├── main | ||
| │ │ │ ├── main.jsx | ||
| │ │ │ └── main.scss | ||
| │ │ ├── Article | ||
| │ │ │ ├── article.jsx | ||
| │ │ │ └── article.scss | ||
| ├── pages | ||
| │ ├── Mainpage.jsx | ||
| │ └── Mainpage.scss | ||
| ├── App.js | ||
| ├── index.js | ||
| └── index.scss | ||
| ``` |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,39 @@ | ||
| { | ||
| "name": "junglecinema", | ||
| "version": "0.1.0", | ||
| "private": true, | ||
| "dependencies": { | ||
| "@testing-library/jest-dom": "^5.14.1", | ||
| "@testing-library/react": "^13.0.0", | ||
| "@testing-library/user-event": "^13.2.1", | ||
| "react": "^18.2.0", | ||
| "react-dom": "^18.2.0", | ||
| "react-scripts": "5.0.1", | ||
| "sass": "^1.64.1", | ||
| "web-vitals": "^2.1.0" | ||
| }, | ||
| "scripts": { | ||
| "start": "react-scripts start", | ||
| "build": "react-scripts build", | ||
| "test": "react-scripts test", | ||
| "eject": "react-scripts eject" | ||
| }, | ||
| "eslintConfig": { | ||
| "extends": [ | ||
| "react-app", | ||
| "react-app/jest" | ||
| ] | ||
| }, | ||
| "browserslist": { | ||
| "production": [ | ||
| ">0.2%", | ||
| "not dead", | ||
| "not op_mini all" | ||
| ], | ||
| "development": [ | ||
| "last 1 chrome version", | ||
| "last 1 firefox version", | ||
| "last 1 safari version" | ||
| ] | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,43 @@ | ||
| <!DOCTYPE html> | ||
| <html lang="en"> | ||
| <head> | ||
| <meta charset="utf-8" /> | ||
| <link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <meta name="theme-color" content="#000000" /> | ||
| <meta | ||
| name="description" | ||
| content="Web site created using create-react-app" | ||
| /> | ||
| <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> | ||
| <!-- | ||
| manifest.json provides metadata used when your web app is installed on a | ||
| user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ | ||
| --> | ||
| <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> | ||
| <!-- | ||
| Notice the use of %PUBLIC_URL% in the tags above. | ||
| It will be replaced with the URL of the `public` folder during the build. | ||
| Only files inside the `public` folder can be referenced from the HTML. | ||
|
|
||
| Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will | ||
| work correctly both with client-side routing and a non-root public URL. | ||
| Learn how to configure a non-root public URL by running `npm run build`. | ||
| --> | ||
| <title>React App</title> | ||
| </head> | ||
| <body> | ||
| <noscript>You need to enable JavaScript to run this app.</noscript> | ||
| <div id="root"></div> | ||
| <!-- | ||
| This HTML file is a template. | ||
| If you open it directly in the browser, you will see an empty page. | ||
|
|
||
| You can add webfonts, meta tags, or analytics to this file. | ||
| The build step will place the bundled scripts into the <body> tag. | ||
|
|
||
| To begin the development, run `npm start` or `yarn start`. | ||
| To create a production bundle, use `npm run build` or `yarn build`. | ||
| --> | ||
| </body> | ||
| </html> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
| { | ||
| "short_name": "React App", | ||
| "name": "Create React App Sample", | ||
| "icons": [ | ||
| { | ||
| "src": "favicon.ico", | ||
| "sizes": "64x64 32x32 24x24 16x16", | ||
| "type": "image/x-icon" | ||
| }, | ||
| { | ||
| "src": "logo192.png", | ||
| "type": "image/png", | ||
| "sizes": "192x192" | ||
| }, | ||
| { | ||
| "src": "logo512.png", | ||
| "type": "image/png", | ||
| "sizes": "512x512" | ||
| } | ||
| ], | ||
| "start_url": ".", | ||
| "display": "standalone", | ||
| "theme_color": "#000000", | ||
| "background_color": "#ffffff" | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| # https://www.robotstxt.org/robotstxt.html | ||
| User-agent: * | ||
| Disallow: |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| import Mainpage from './pages/Mainpage'; | ||
|
|
||
| function App() { | ||
| return ( | ||
| <> | ||
| <Mainpage /> | ||
| </> | ||
| ); | ||
| } | ||
|
|
||
| export default App; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| import React from 'react'; | ||
| import './Footer.scss'; | ||
| import line from '../../images/footerLine.svg'; | ||
| import twitterSVG from '../../images/icon-twitter.svg'; | ||
| import instagramSVG from '../../images/icon-instagram.svg'; | ||
| import facebookSVG from '../../images/icon-facebook.svg'; | ||
|
|
||
| export default function Footer() { | ||
| const moveSite = (site) => { | ||
| if (site === 'blog') window.open('https://blog.naver.com/paul-lab', '_blank'); | ||
| if (site === 'instagram') window.open('https://www.instagram.com/weniv_official/', '_blank'); | ||
| if (site === 'facebook') window.open('https://www.facebook.com/Jejucoding', '_blank'); | ||
| }; | ||
|
|
||
| return ( | ||
| <footer> | ||
| <div className='wrapperTop'> | ||
| <div className='top'> | ||
| <h2>Jungle Cinema</h2> | ||
| <div className='imgGroup'> | ||
| <img | ||
| className='footerSVG' | ||
| src={twitterSVG} | ||
| alt='twitter' | ||
| onClick={() => { | ||
| moveSite('blog'); | ||
| }} | ||
| /> | ||
| <img | ||
| className='footerSVG' | ||
| src={instagramSVG} | ||
| alt='instagram' | ||
| onClick={() => { | ||
| moveSite('instagram'); | ||
| }} | ||
| /> | ||
| <img | ||
| className='footerSVG' | ||
| src={facebookSVG} | ||
| alt='facebook' | ||
| onClick={() => { | ||
| moveSite('facebook'); | ||
| }} | ||
| /> | ||
| </div> | ||
| </div> | ||
| </div> | ||
| <img src={line} alt='' /> | ||
| <div className='wrapperBottom'> | ||
| <p className='footerInfo'> | ||
| <span>(주) 정글 시네마</span> | <span>대표</span> 라이언 | <span>사업자 번호</span> 000-0000-0000 | 광고 영화 및 비디오물 제작업 | 주소 서울특별시 | ||
| </p> | ||
| <p className='footerLogo'>ⓒ The Jungle</p> | ||
| </div> | ||
| </footer> | ||
| ); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,63 @@ | ||
| footer { | ||
| width: 100%; | ||
| height: 13.3125rem; | ||
|
|
||
| background-color: #f2f2f2; | ||
|
|
||
| display: flex; | ||
| flex-direction: column; | ||
| align-items: center; | ||
| } | ||
|
|
||
| .wrapperTop, | ||
| .wrapperBottom { | ||
| width: 74.3125rem; | ||
| } | ||
|
|
||
| .wrapperBottom { | ||
| display: flex; | ||
| padding-top: 2.25rem; | ||
| } | ||
|
|
||
| .footerLogo { | ||
| margin-left: auto; | ||
| color: #4f4f4f; | ||
| font-family: Noto Sans KR; | ||
| font-size: 0.875rem; | ||
| font-weight: 700; | ||
| } | ||
|
|
||
| .top { | ||
| display: flex; | ||
| padding-top: 3.31rem; | ||
| padding-bottom: 2.63rem; | ||
| justify-content: space-between; | ||
| } | ||
|
|
||
| .imgGroup { | ||
| display: flex; | ||
| } | ||
|
|
||
| .footerInfo { | ||
| color: #4f4f4f; | ||
| font-family: Noto Sans KR; | ||
| font-size: 0.875rem; | ||
| font-weight: 400; | ||
| } | ||
|
|
||
| .footerInfo > span { | ||
| font-weight: 700; | ||
| } | ||
|
|
||
| .footerSVG:hover { | ||
| transform: scale(1.3); | ||
| } | ||
|
|
||
| h2 { | ||
| color: #000; | ||
| font-family: Roboto; | ||
| font-size: 1.375rem; | ||
| font-style: normal; | ||
| font-weight: 700; | ||
| line-height: normal; | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,58 @@ | ||
| import React from 'react'; | ||
| import './Article.scss'; | ||
| import play from '../../../images/icon-play.svg'; | ||
| import movieData from './data.json'; | ||
|
|
||
| export default function Article() { | ||
| const moveSite = (site) => { | ||
| if (site !== 'none') { | ||
| window.open(site, '_blank'); | ||
| } else { | ||
| alert('준비중...'); | ||
| } | ||
| }; | ||
|
|
||
| return ( | ||
| <article className='cardArticle'> | ||
| {movieData?.map((data) => { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 데이터가 정적으로 들어오기 때문에 데이터가 없는 경우가 고려되어 있지 않는데, 통신으로 받아오는 프로젝트는 값이 비어있을 경우가 있기 때문에 레이아웃이 깨지지 않게 설정해주시거나 데이터가 없다는 것을 알 수 있도록 구현해주시면 더 좋을 것 같아요!
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Warning: Each child in a list should have a unique "key" prop. Key는 React가 어떤 항목을 변경, 추가 또는 삭제할지 식별하는 것을 돕습니다. key는 엘리먼트에 안정적인 고유성을 부여하기 위해 배열 내부의 엘리먼트에 지정해야 합니다. |
||
| return ( | ||
| <section className='card'> | ||
| <div className='textGroup'> | ||
| <img className='poster' alt='poster' src={require(`${data.image}`)}></img> | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. img의 alt 속성은 h3 태그로 영화의 제목 정보를 주고 있기 때문에 비워두셔도 괜찮을 것 같습니다. |
||
| <h3 className='title'>{data.title}</h3> | ||
| <ol className='info'> | ||
| <div className='subjectGroup'> | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ol,ul 직계자식은 li만 사용한다고해요! |
||
| <li> | ||
| <span className='infoPadding type'>개요</span> | ||
| <span className='content subject'>{data.summary}</span> | ||
| </li> | ||
| <li> | ||
| <span className='infoPadding type'>평점</span> | ||
| <span className='content'>{data.score}</span> | ||
| </li> | ||
| </div> | ||
| <li> | ||
| <span className='infoPadding type'>개봉</span> | ||
| <span className='content'>{data.open}</span> | ||
| </li> | ||
| <li> | ||
| <span className='infoPadding type'>출연</span> | ||
| <span className='content'>{data.character}</span> | ||
| </li> | ||
| </ol> | ||
| </div> | ||
| <div className='btnGroup'> | ||
| <button className='btnTicketing' onClick={() => moveSite(data.link)}> | ||
| 예매하기 | ||
| </button> | ||
| <button className='btnPreview' disabled> | ||
| <img src={play} alt='playBtn' /> | ||
| 예고편 | ||
| </button> | ||
| </div> | ||
| </section> | ||
| ); | ||
| })} | ||
| </article> | ||
| ); | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍👍
trasition도 사용해보면 더 멋있을거 같아요