Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
170b317
문서: 구현할 기능 목록 작성
maywngml Dec 9, 2020
08fa7da
문서: 구현 기능 목록에 입력값 처리 기능 추가
maywngml Dec 9, 2020
dd91f43
문서: 노선 목록 조회 조건 추가
maywngml Dec 10, 2020
799a5e5
기능추가: 지하철 역 등록 기능 추가
Dec 11, 2020
b7ea83c
Merge branch 'maywngml' of https://github.com/maywngml/javascript-sub…
Dec 11, 2020
5172c79
리팩토링: common.js내 변수와 함수들을 기능별로 분리해서 elements.js과 items.js로 나눔, 변수명과 문…
Dec 11, 2020
179bab4
기능추가: 지하철 역 목록 조회 기능 추가
Dec 12, 2020
8bc578e
문서: 지하철 노선 등록 기능 조건 추가
maywngml Dec 12, 2020
b94d233
기능추가: 지하철 노선 등록 기능 추가
Dec 12, 2020
08367d7
Merge branch 'maywngml' of https://github.com/maywngml/javascript-sub…
Dec 12, 2020
7ec665c
기능추가: 지하철 노선 목록 조회 기능 추가
Dec 12, 2020
ae9fcf4
리팩토링: 테이블에 행을 추가하는 함수 새로 생성하여 중복 코드 제거
Dec 14, 2020
c80456f
기능추가: 지하철 노선 삭제 기능 추가
Dec 14, 2020
43a7f9a
리팩토링: 노선 추가시 상행종점역과 하행종점역은 다르게 입력하도록 수정 및 alert창 띄우는 방식 수정
Dec 14, 2020
56b9315
리팩토링: 노선의 상행종점역, 하행종점역을 반환하는 함수 생성하여 중복코드 제거
Dec 14, 2020
febb5fe
기능추가: 노선에 등록된 역의 목록을 조회하는 기능 추가
Dec 14, 2020
600357c
문서: 지하철 구간 관련 기능의 조회 기능 추가
Dec 14, 2020
a9fbf1d
기능추가: 지하철 역 삭제 기능 추가
Dec 14, 2020
8f8d890
기능추가: 지하철 노선에 구간 추가하는 기능 구현
Dec 14, 2020
9069943
기능추가: 노선에 등록된 역 제거하는 기능 추가
Dec 14, 2020
82f96d9
기능추가: 지하철 전체 노선 조회 기능 추가
Dec 14, 2020
899dcce
문서: 지하철 노선 등록 조건 추가
Dec 14, 2020
961a085
리팩토링: 역과 노선 추가시 배열의 마지막 인덱스 앞에 삽입되던 현상 수정
Dec 15, 2020
687da02
리팩토링: boolean 반환하는 함수들 간결하게 수정
Dec 15, 2020
63b446b
리팩토링: getItemList함수에서 해당 키 값에 대한 데이터가 존재하지 않을 경우에는 빈 배열을 반환하도록 수정, ad…
Dec 15, 2020
34ab913
리팩토링: 기존 함수들 더 세세하게 분리 및 노선에 등록된 역이 삭제되던 오류 수정
Dec 15, 2020
bb57e47
리팩토링: 비즈니스 로직과 뷰를 분리
Dec 15, 2020
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
18 changes: 18 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
module.exports = {
env: {
browser: true,
es2021: true
},
extends: [
'standard'
],
parserOptions: {
ecmaVersion: 12,
sourceType: 'module'
},
rules: {
indent: [
'tab',
4]
}
}
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/.vscode/
/node_modules/
141 changes: 32 additions & 109 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,114 +1,37 @@
# 🚇 지하철 노선도 미션

## 🚀 기능 요구사항
## 🚀 구현 기능 목록

### 지하철 역 관련 기능
- 지하철 역을 등록하고 삭제할 수 있다. (단, 노선에 등록된 역은 삭제할 수 없다)
- 중복된 지하철 역 이름이 등록될 수 없다.
- 지하철 역은 2글자 이상이어야 한다.
- 지하철 역의 목록을 조회할 수 있다.

- 사용자가 입력한 이름으로 지하철 역을 등록한다.
- 역 이름이 2글자 이상인지 확인해야 한다.
- 역 이름의 중복여부를 확인해야 한다.
- 등록된 지하철 역을 삭제한다.
- 노선에 등록되어 있는지 확인해야 한다.
- 지하철 역의 목록을 조회한다.
### 지하철 노선 관련 기능
- 지하철 노선을 등록하고 삭제할 수 있다.
- 중복된 지하철 노선 이름이 등록될 수 없다.
- 노선 등록 시 상행 종점역과 하행 종점역을 입력받는다.
- 지하철 노선의 목록을 조회할 수 있다.

### 지하철 구간 추가 기능
- 지하철 노선에 구간을 추가하는 기능은 노선에 역을 추가하는 기능이라고도 할 수 있다.
- 역과 역사이를 구간이라 하고 이 구간들의 모음이 노선이다.
- 하나의 역은 여러개의 노선에 추가될 수 있다.
- 역과 역 사이에 새로운 역이 추가 될 수 있다.
- 노선에서 갈래길은 생길 수 없다.

<img width="500" src="/images/section1.png">

### 지하철 구간 삭제 기능
- 노선에 등록된 역을 제거할 수 있다.
- 종점을 제거할 경우 다음 역이 종점이 된다.
- 노선에 포함된 역이 두개 이하일 때는 역을 제거할 수 없다.

<img width="500" src="/images/section2.png">

### 지하철 노선에 등록된 역 조회 기능
- 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회할 수 있다.

<br/>

## 💻 프로그램 실행 결과

### 역관리
<img width="100%" src="/images/station_manager.gif">

### 노선관리
<img width="100%" src="/images/line_manager.gif">

### 구간관리
<img width="100%" src="/images/section_manager.gif">

### 노선도 출력
<img width="100%" src="/images/map_print_manager.gif">


## ✅ 프로그래밍 요구사항

### 메뉴 버튼
- 역 관리 button 태그는 `#station-manager-button` id값을 가진다.
- 노선 관리 button 태그는 `#line-manager-button` id값을 가진다.
- 구간 관리 button 태그는 `#section-manager-button` id값을 가진다.
- 지하철 노선도 출력 관리 button 태그는 `#map-print-manager-button` id값을 가진다.

### 지하철 역 관련 기능
- 지하철 역을 입력하는 input 태그는 `#station-name-input` id값을 가진다.
- 지하철 역을 추가하는 button 태그는 `#station-add-button` id값을 가진다.
- 지하철 역을 삭제하는 button 태그는 `.station-delete-button` class값을 가진다.

### 지하철 노선 관련 기능
- 지하철 노선의 이름을 입력하는 input 태그는 `#line-name-input` id값을 가진다.
- 지하철 노선의 상행 종점을 선택하는 select 태그는 `#line-start-station-selector` id값을 가진다.
- 지하철 노선의 하행 종점을 선택하는 select 태그는 `#line-end-station-selector` id값을 가진다.
- 지하철 노선을 추가하는 button 태그는 `#line-add-button` id값을 가진다.
- 지하철 노선을 삭제하는 button 태그는 `.line-delete-button` class값을 가진다.

### 지하철 구간 추가 기능
- 지하철 노선을 선택하는 button 태그는 `.section-line-menu-button` class값을 가진다.
- 지하철 구간을 설정할 역 select 태그는 `#section-station-selector` id값을 가진다.
- 지하철 구간의 순서를 입력하는 input 태그는 `#section-order-input` id값을 가진다.
- 지하철 구간을 등록하는 button 태그는 `#section-add-button` id값을 가진다.
- 지하철 구간을 제거하는 button 태그는 `.section-delete-button` class값을 가진다.

### 지하철 노선도 출력 기능
- 지하철 노선도 출력 버튼을 누르면 `<div class="map"></div>` 태그를 만들고 해당 태그 내부에 노선도를 출력한다.

### 기존 요구사항

- 사용자가 잘못된 입력 값을 작성한 경우 `alert`을 이용해 메시지를 보여주고, 재입력할 수 있게 한다.
- 외부 라이브러리(jQuery, Lodash 등)를 사용하지 않고, 순수 Vanilla JS로만 구현한다.
- **자바스크립트 코드 컨벤션을 지키면서 프로그래밍** 한다
- [https://google.github.io/styleguide/jsguide.html](https://google.github.io/styleguide/jsguide.html)
- [https://ui.toast.com/fe-guide/ko_CODING-CONVENSION/](https://ui.toast.com/fe-guide/ko_CODING-CONVENTION)
- **indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용**한다.
- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다.
- **함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다.**
- 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다.
- 변수 선언시 `var` 를 사용하지 않는다. `const` 와 `let` 을 사용한다.
- [const](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/const)
- [let](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/let)
- `import` 문을 이용해 스크립트를 모듈화하고 불러올 수 있게 만든다.
- [https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/import](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/import)
- `template literal`을 이용해 데이터와 html string을 가독성 좋게 표현한다.
- [https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals)

### 추가된 요구사항
- [data](https://developer.mozilla.org/ko/docs/Learn/HTML/Howto/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%86%8D%EC%84%B1_%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0)속성을 활용하여 html 태그에 역, 노선, 구간의 유일한 데이터 값들을 관리한다.
- [localStorage](https://developer.mozilla.org/ko/docs/Web/API/Window/localStorage)를 이용하여, 새로고침하더라도 가장 최근에 작업한 정보들을 불러올 수 있도록 한다.

<br/>

## 📝 미션 저장소 및 진행 요구사항

- 미션은 [https://github.com/woowacourse/javascript-subway-map-precours](https://github.com/woowacourse/javascript-subway-map-precourse) 저장소를 fork/clone해 시작한다.
- **기능을 구현하기 전에 javascript-subway-precourse/docs/README.md 파일에 구현할 기능 목록**을 정리해 추가한다.
- **git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가**한다.
- [프리코스 과제 제출](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 문서 절차를 따라 미션을 제출한다.
- 지하철 노선을 등록한다.
- 노선의 중복 여부를 확인해야 한다.
- 상행종점역과 하행종점역은 지하철 역 목록의 첫번째 값이 기본값이다.
- 상행종점역과 하행종점역은 서로 달라야 한다.
- 지하철 노선을 삭제한다.
- 지하철 노선 목록을 조회한다.
- 노선 이름, 상행 종점역, 하행 종점역을 조회해야 한다.
- 노선 이름은 오름차순으로 정렬한다.
### 지하철 구간 관련 기능
- 기존의 지하철 노선 사이에 역을 새로 추가한다.
- 추가하려는 노선에 이미 등록된 역인지 확인해야 한다.
- 임의로 순서를 정할 수 있다.
- 순서 입력값이 '0 ~ 노선에 등록된 역의 수' 사이인지 확인해야 한다.
- 노선에 등록된 역을 제거한다.
- 노선내의 역의 개수가 2개를 초과하는지 확인해야 한다.
- 상행종점역을 제거했을 경우 다음역이 상행종점역이 되도록 한다.
- 하행종점역을 제거했을 경우 이전역이 하행종점역이 되도록 한다.
- 노선에 등록된 역의 목록을 조회한다.
### 지하철 전체 노선 조회 기능
- 모든 지하철 노선의 역 목록을 조회한다.
### 공통 기능
- 데이터의 등록이나 삭제가 불가할 경우 alert창을 띄운다.
- 기존 데이터를 삭제할 경우 팝업창을 띄워서 한번 더 확인할 수 있도록 한다.
- 입력값이 빈값인지 확인해야 한다.
- 입력값의 공백을 제거해야 한다.
8 changes: 8 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,19 @@
<html lang="kr">
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="./src/style.css">
<title>지하철 노선도 관리</title>
</head>
<body>
<div id="app">
<h1>🚇 지하철 노선도 관리 </h1>
<div id="manager-buttons">
<button id="station-manager-button">1. 역 관리</button>
<button id="line-manager-button">2. 노선 관리</button>
<button id="section-manager-button">3. 구간 관리</button>
<button id="map-print-manager-button">4. 지하철 노선도 출력</button>
</div>
<div id="manager-part"></div>
</div>
<script type="module" src="src/index.js"></script>
</body>
Expand Down
Loading