|
1 | | -# React + TypeScript + Vite |
| 1 | +# Tutorial-Sejong |
2 | 2 |
|
3 | | -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. |
| 3 | +<div align="center"> |
| 4 | + <img width="50%" src="https://github.com/user-attachments/assets/b724bb30-bb52-4a03-8f5c-31d546cabfb8"> |
| 5 | + <br> |
| 6 | + Tutorial-Sejong은 실제와 유사한 환경에서 수강 신청을 연습할 수 있는 서비스를 제공해 학우들의 수강신청 준비에 도움을 드리고자 만들게 된 서비스 입니다. |
| 7 | + <br> |
| 8 | + 수강신청이 처음이거나 오랜만 또는 연습이 필요한 세종대 학우들을 위해 최대한 세종대학교 학사시스템 UI와 비슷하게 제작했습니다. |
| 9 | +</div> |
4 | 10 |
|
5 | | -Currently, two official plugins are available: |
| 11 | +## 목차 |
6 | 12 |
|
7 | | -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh |
8 | | -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh |
| 13 | +<b> 1. [개요](#개요)</b> |
| 14 | +<br> |
| 15 | +<b> 2. [주요 기능](#주요-기능)</b> |
| 16 | +<br> |
| 17 | +<b> 3. [팀 소개](#팀-소개)</b> |
| 18 | +<br> |
| 19 | +<b> 4. [기술스택](#기술스택)</b> |
| 20 | +<br> |
| 21 | +<b> 5. [화면](#화면)</b> |
| 22 | +<br> |
| 23 | +<b> 6. [디렉토리 구조](#디렉토리-구조)</b> |
9 | 24 |
|
10 | | -## Expanding the ESLint configuration |
| 25 | +## 개요 |
11 | 26 |
|
12 | | -If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: |
| 27 | +<b>배포 주소:</b> https://tutorial-sejong.com/ |
| 28 | +<br> |
| 29 | +<b>프론트 깃허브 주소:</b> https://github.com/tutorial-sejong/cr-frontend |
| 30 | +<br> |
| 31 | +<b>백엔드 깃허브 주소:</b> https://github.com/tutorial-sejong/cr-backend |
13 | 32 |
|
14 | | -- Configure the top-level `parserOptions` property like this: |
| 33 | +## 팀 소개 |
| 34 | + |
| 35 | +<table> |
| 36 | +<thead> |
| 37 | + <tr> |
| 38 | + <th colspan="4">Tutorial-Sejong</th> |
| 39 | + </tr> |
| 40 | +</thead> |
| 41 | +<tbody> |
| 42 | + <tr> |
| 43 | + <td>안정현</br> <a href="https://github.com/Anhye0n">깃허브</a><br/> </td> |
| 44 | + <td>오지현</br> <a href="https://github.com/zhy2on">깃허브</a><br/> </td> |
| 45 | + <td>문지원</br> <a href="https://github.com/jeewonMoon">깃허브</a><br/> </td> |
| 46 | + <td>황수빈</br> <a href="https://github.com/surra7">깃허브</a><br/> </td> |
| 47 | + </tr> |
| 48 | +</tbody> |
| 49 | +</table> |
| 50 | + |
| 51 | +## 주요 기능 |
| 52 | + |
| 53 | +### 💡2025년 1학기 시간표 검색 |
| 54 | + |
| 55 | +- 해당 학기에 맞는 시간표로 업데이트 됩니다. |
| 56 | + |
| 57 | +### 💡관심 과목 담기 |
| 58 | + |
| 59 | +- 관심 과목을 기반으로 생성된 시간표를 확인할 수 있습니다. |
| 60 | +- 어떤 강의를 많이 담았는지 인기 관심 과목 순위로 알 수 있습니다. |
| 61 | + |
| 62 | +### 💡수강신청 |
| 63 | + |
| 64 | +- 학과와 수강신청 날짜(본인학년/전학년)를 선택해 신청할 수 있는 학과를 제한할 수 있습니다. |
| 65 | +- 신청 시 10% 확률로 수강 여석이 없을 수 있습니다. |
| 66 | +- 시작 후 35초가 지나면 모든 과목의 수강 여석이 마감됩니다. (제한 시간은 변경할 수 있습니다.) |
| 67 | + |
| 68 | +## 기술스택 |
| 69 | + |
| 70 | +### 프론트엔드 |
| 71 | + |
| 72 | +<img src="https://img.shields.io/badge/vite-646CFF?style=for-the-badge&logo=vite&logoColor=white"> <img src="https://img.shields.io/badge/react-61DAFB?style=for-the-badge&logo=react&logoColor=black"> <img src="https://img.shields.io/badge/typescript-3178C6?style=for-the-badge&logo=typescript&logoColor=white"> <img src="https://img.shields.io/badge/styledcomponents-DB7093?style=for-the-badge&logo=styledcomponents&logoColor=white"> |
| 73 | +<img src="https://img.shields.io/badge/reduxtoolkit-764ABC?style=for-the-badge&logo=redux&logoColor=white"> <img src="https://img.shields.io/badge/githubactions-2088FF?style=for-the-badge&logo=githubactions&logoColor=white"> |
| 74 | + |
| 75 | +### 백엔드 |
| 76 | + |
| 77 | +<img src="https://img.shields.io/badge/java-007396?style=for-the-badge&logo=java&logoColor=white"> |
| 78 | +<img src="https://img.shields.io/badge/spring boot-6DB33F?style=for-the-badge&logo=spring boot&logoColor=white"> |
| 79 | +<img src="https://img.shields.io/badge/spring security-6DB33F?style=for-the-badge&logo=Spring Security&logoColor=white"> <img src="https://img.shields.io/badge/MariaDB-003545?style=for-the-badge&logo=mariadb&logoColor=white" /> |
| 80 | +<img src="https://img.shields.io/badge/githubactions-2088FF?style=for-the-badge&logo=githubactions&logoColor=white"> |
| 81 | +<img src="https://img.shields.io/badge/docker-2496ED?style=for-the-badge&logo=docker&logoColor=white"> |
| 82 | + |
| 83 | +### 협업 툴 |
| 84 | + |
| 85 | +<img src="https://img.shields.io/badge/github-181717?style=for-the-badge&logo=github&logoColor=white"> <img src="https://img.shields.io/badge/notion-000000?style=for-the-badge&logo=Notion&logoColor=white"> <img src="https://img.shields.io/badge/jira-0052CC?style=for-the-badge&logo=jira&logoColor=white"> |
| 86 | + |
| 87 | +## 화면 |
| 88 | + |
| 89 | +<details> |
| 90 | +<summary>화면 접기/펼치기</summary> |
| 91 | +<div markdown="1"> |
| 92 | + |
| 93 | +### 로그인 |
| 94 | + |
| 95 | +<img src="https://github.com/user-attachments/assets/c9d8f9dd-97e0-4c3f-8725-21d236ecdc4e"> |
| 96 | + |
| 97 | +- 회원가입 없이 임의 학번으로 로그인 |
| 98 | +- 동일한 학번과 비밀번호로 접속 시 관심과목 등 데이터 유지 |
| 99 | + |
| 100 | +### 시간표 검색 |
| 101 | + |
| 102 | +<img src="https://github.com/user-attachments/assets/88fd868c-e9c3-4ac9-9fd5-a43b5158f02a"> |
| 103 | + |
| 104 | +- 메뉴바 하단에서 인기 관심 과목 순위 확인 가능 |
| 105 | + |
| 106 | +<img src="https://github.com/user-attachments/assets/74872fe2-d426-4c1b-9301-6f2d33c48ad2"> |
| 107 | + |
| 108 | +- 과목 클릭시 상세 정보 모달 |
| 109 | + |
| 110 | +### 관심과목 담기 |
| 111 | + |
| 112 | +<img src="https://github.com/user-attachments/assets/55df1f8a-a565-4773-a718-543deec1d82a"> |
| 113 | + |
| 114 | +<img src="https://github.com/user-attachments/assets/c713f288-5a07-4544-b2be-b4492cacf162"> |
| 115 | + |
| 116 | +- 시간표 버튼 클릭했을 때 관심 과목이 없는 경우 |
| 117 | + |
| 118 | + |
| 119 | + |
| 120 | +- 관심 과목 기반 시간표 생성 |
| 121 | +- 시간이 겹치는 경우: |
| 122 | + - 시작 시간이 같은 경우 -> 끝나는 시간이 빠른 것이 앞으로 |
| 123 | + - 시작 시간이 다른 경우 -> 시작 시간이 늦은 것이 앞으로 |
| 124 | + |
| 125 | +### 수강신청 |
| 126 | + |
| 127 | +<img src="https://github.com/user-attachments/assets/4d11e297-34b7-4a6a-b864-70f384908f39"> |
| 128 | + |
| 129 | +- 학과, 수강신청 날짜 선택 가능 |
| 130 | +- 선택 안 할 시 전학년으로 지정 |
| 131 | + |
| 132 | +<img src="https://github.com/user-attachments/assets/c42ddbd9-bc44-440d-aba8-09821646811b"> |
| 133 | + |
| 134 | +- 헤더의 시간에 맞춰 시작 |
| 135 | +- 시작 버튼을 눌러야 검색 가능 |
| 136 | +- 시간 제한: |
| 137 | + - 기본값 35초 |
| 138 | + - 최소/최대값: 10초, 1분(3600초) |
| 139 | + - 최소/최대값을 벗어난 값 입력시 최소/최대값으로 자동 조정 |
| 140 | + |
| 141 | +<img src="https://github.com/user-attachments/assets/d35be6b4-528b-43d1-a83e-6d815528f816"> |
| 142 | + |
| 143 | +- 랜덤으로 매크로 방지 이미지 생성 |
| 144 | + |
| 145 | +<img src="https://github.com/user-attachments/assets/efd7acd4-53b0-4cc8-acff-24bb152d5e96"> |
| 146 | + |
| 147 | +- 시작 버튼을 누르고 지정한 제한 시간이 지났거나 10%의 확률로 실패 |
| 148 | + |
| 149 | +<img src="https://github.com/user-attachments/assets/513b94b2-b67f-488d-84f1-3bfe8b5f4a20"> |
| 150 | + |
| 151 | +- 확인 버튼 누를 시 수강 신청 실패로 간주, 새로고침 |
| 152 | + |
| 153 | +### 404 |
| 154 | + |
| 155 | +<img src="https://github.com/user-attachments/assets/ad8426b7-5683-4bca-9b8a-151b0c438ea4"> |
| 156 | + |
| 157 | +- 잘못된 경로 또는 서버 오류시 보여지는 화면 |
| 158 | + |
| 159 | +</div> |
| 160 | +</details> |
| 161 | +<br> |
| 162 | + |
| 163 | +## 디렉토리 구조 |
15 | 164 |
|
16 | | -```js |
17 | | -export default { |
18 | | - // other rules... |
19 | | - parserOptions: { |
20 | | - ecmaVersion: 'latest', |
21 | | - sourceType: 'module', |
22 | | - project: ['./tsconfig.json', './tsconfig.node.json'], |
23 | | - tsconfigRootDir: __dirname, |
24 | | - }, |
25 | | -} |
26 | 165 | ``` |
| 166 | +cs-frontend |
| 167 | +├─ .eslintrc.cjs : lint 규칙 |
| 168 | +├─ .prettierrc : prettier 설정 |
| 169 | +├─ index.html |
| 170 | +├─ package-lock.json |
| 171 | +├─ package.json |
| 172 | +├─ README.md |
| 173 | +├─ src |
| 174 | +│ ├─ apis |
| 175 | +│ │ ├─ api : api 요청/응답 코드 폴더 |
| 176 | +│ │ │ ├─ auth.ts : 로그인 및 인증 관련 코드 |
| 177 | +│ │ │ └─ course.ts : 강의 및 수강신청 관련 코드 |
| 178 | +│ │ └─ utils : 인스턴스 / 공통 함수 폴더 |
| 179 | +│ ├─ App.tsx |
| 180 | +│ ├─ assets |
| 181 | +│ │ ├─ data |
| 182 | +│ │ │ ├─ constant.ts : 상수 데이터 |
| 183 | +│ │ │ └─ filter.ts : 필터 옵션 데이터 |
| 184 | +│ │ ├─ img : 아이콘이나 로고 등 필요한 이미지 폴더 |
| 185 | +│ │ └─ types : 자주 쓰이는 타입 분리 폴더 |
| 186 | +│ ├─ components |
| 187 | +│ │ ├─ common : 여러 곳에서 쓰이는 컴포넌트 폴더 |
| 188 | +│ │ │ ├─ FilterButton.tsx : 검색, 조회 등 필터 적용 버튼 |
| 189 | +│ │ │ ├─ FilterInput.tsx |
| 190 | +│ │ │ ├─ Modal |
| 191 | +│ │ │ │ ├─ handlers |
| 192 | +│ │ │ │ │ └─ handler.tsx |
| 193 | +│ │ │ │ ├─ AntiMacroCodeModal.tsx : 매크로 모달 |
| 194 | +│ │ │ │ ├─ EnrollmentInfoModal.tsx : 수강인원 등 강의 정보 모달 |
| 195 | +│ │ │ │ ├─ ErrorModal.tsx |
| 196 | +│ │ │ │ ├─ InfoModal.tsx : 수강신청 모달 |
| 197 | +│ │ │ │ ├─ LoadingModal.tsx |
| 198 | +│ │ │ │ ├─ RankInfoModal.tsx : 인기 관심 과목 상세 정보 모달 |
| 199 | +│ │ │ │ ├─ TimetableModal : 시간표 모달 |
| 200 | +│ │ │ │ └─ WaitingModal.tsx : 접속 대기 모달 |
| 201 | +│ │ │ ├─ SelectBox.tsx : 필터 드롭다운 |
| 202 | +│ │ │ └─ Table : 강의 목록 테이블 |
| 203 | +│ │ ├─ CourseRegister : 수강신청 탭 |
| 204 | +│ │ ├─ DeleteAccount |
| 205 | +│ │ ├─ Header |
| 206 | +│ │ │ ├─ ... |
| 207 | +│ │ │ └─ TopNav.tsx : 타이틀 |
| 208 | +│ │ ├─ LectureList : 시간표 검색 탭 |
| 209 | +│ │ ├─ LoginForm |
| 210 | +│ │ ├─ Menubar : 사이드 메뉴 |
| 211 | +│ │ ├─ ProtectedRoute.tsx : 사용자 인증 여부에 따른 접근 제한 |
| 212 | +│ │ ├─ TabMenu |
| 213 | +│ │ ├─ Wishlist : 관심과목 탭 |
| 214 | +│ │ └─ WishRank : 인기 관심 과목 |
| 215 | +│ ├─ custom.d.ts : svg 관련 설정 파일 |
| 216 | +│ ├─ main.tsx |
| 217 | +│ ├─ pages |
| 218 | +│ │ ├─ DeleteAccount.tsx |
| 219 | +│ │ ├─ index |
| 220 | +│ │ │ ├─ Home.tsx |
| 221 | +│ │ │ ├─ Login.tsx |
| 222 | +│ │ │ └─ NotFound.tsx : 에러 페이지 |
| 223 | +│ │ └─ Maintenance.tsx : 리뉴얼 중 페이지 |
| 224 | +│ ├─ store : 리덕스 툴킷 관련 폴더 |
| 225 | +│ │ ├─ hooks |
| 226 | +│ │ │ └─ index.ts |
| 227 | +│ │ ├─ modules : 슬라이스 |
| 228 | +│ │ └─ store.ts |
| 229 | +│ ├─ styles : 공통 스타일 |
| 230 | +│ ├─ utils |
| 231 | +│ │ ├─ randomUtils.ts : 랜덤 학번 및 숫자 생성 |
| 232 | +│ │ └─ scrollToTop.ts : 페이지 이동 시 스크롤 초기화 |
| 233 | +│ └─ vite-env.d.ts |
| 234 | +├─ tsconfig.app.json |
| 235 | +├─ tsconfig.json |
| 236 | +├─ tsconfig.node.json |
| 237 | +└─ vite.config.ts |
27 | 238 |
|
28 | | -- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` |
29 | | -- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` |
30 | | -- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list |
| 239 | +``` |
0 commit comments