Skip to content

gcu-LastDance/GachonOJ-Frontend

Repository files navigation

GachonOJ 이동하기

👻 Member

BE(PM) BE FE FE
나민혁 프로필 조기헌 프로필 정현진 프로필 은현수 프로필
나민혁 🐥 조기헌 정현진 은현수

GachonOJ 가천대학교 학생들을 위한 저지 서비스 입니다.

개발 기간: 2024.03 - 2024.05

GachonOJ

✨GachonOJ 가천대학교 학생들을 위한 저지 서비스 ✨

🔍 About GachonOJ

GachonOJ는 가천대학교 학생들을 위해 개발되어진 온라인 저지 플랫폼입니다.

🖥️ Service

웹IDE & 채점 서비스 및 AI 피드백 구현 관리자/교수 시험 등록

📦 주요 기능

USER SIDE

⚡️ 웹 IDE

⚡️ 코드 실행 및 채점하기

⚡️ AI 피드백을 통한 코드 개선

⚡️ 손코딩을 대체할 시험 제출

⚡️ 사용자 프로필 관리

ADMIN SIDE

⚡️ 사용자 관리

⚡️ 문제/시험/대회 관리

⚡️ 공지사항/문의사항 관리

🛠️ 주요 의존성 패키지 버전

  • @codemirror/lang-java: 6.0.1
  • @shinyongjun/react-fullpage: 1.10.0
  • @tanstack/react-query: 5.29.2
  • @tanstack/react-table: 8.15.3
  • @uiw/codemirror-theme-github: 4.21.25
  • @uiw/codemirror-theme-vscode: 4.21.25
  • @uiw/react-codemirror: 4.21.25
  • axios: 1.6.8
  • framer-motion: 11.1.9
  • next: 14.1.4
  • next-themes: 0.3.0
  • npm: 10.5.2
  • react: 18.2.0
  • react-beautiful-dnd: 13.1.1
  • react-dom: 18.2.0
  • react-hook-form: 7.51.2
  • react-icons: 5.0.1
  • react-js-pagination: 3.0.3
  • react-spinners: 0.13.8
  • react-transition-group: 4.4.5
  • recharts: 2.12.6
  • shadcn-ui: 0.8.0
  • sharp: 0.33.3
  • swiper: 11.1.3
  • tailwind-merge: 2.2.2
  • tar: 7.1.0
  • zustand: 4.5.2

📁 Project Structure

.
├── Dockerfile
├── README.md
├── api
│   ├── admin
│   │   ├── adminContestAPI.ts
│   │   ├── adminDashboardAPI.ts
│   │   ├── adminExamAPI.ts
│   │   ├── adminInquiryAPI.ts
│   │   ├── adminNoticeAPI.ts
│   │   ├── adminProblemAPI.ts
│   │   └── adminUserAPI.ts
│   ├── authAPI.ts
│   ├── inquiryAPI.ts
│   ├── memberAPI.ts
│   ├── noticeAPI.ts
│   ├── problemAPI.ts
│   ├── professor
│   │   ├── professorDashboardAPI.ts
│   │   ├── professorExamAPI.ts
│   │   ├── professorInfoAPI.ts
│   │   └── professorInquiryAPI.ts
│   └── testAPI.ts
├── app
│   ├── (auth)
│   │   ├── login
│   │   │   ├── _components
│   │   │   │   └── LoginForm.tsx
│   │   │   ├── layout.tsx
│   │   │   └── page.tsx
│   │   ├── pwinquiry
│   │   │   ├── _components
│   │   │   │   └── PwInquiryFrom.tsx
│   │   │   ├── layout.tsx
│   │   │   └── page.tsx
│   │   └── signup
│   │       ├── _components
│   │       │   ├── SignupCard.tsx
│   │       │   └── SignupForm.tsx
│   │       ├── layout.tsx
│   │       └── page.tsx
│   ├── (landing)
│   │   ├── _components
│   │   │   ├── LandingHeader.tsx
│   │   │   ├── LandingHeaderLoginButton.tsx
│   │   │   └── TextTypingAni.tsx
│   │   └── page.tsx
│   ├── (site)
│   │   ├── _components
│   │   │   ├── HeaderButton.tsx
│   │   │   ├── HeaderLoginButton.tsx
│   │   │   ├── HeaderMemberDropdown.tsx
│   │   │   └── HeaderNav.tsx
│   │   ├── contest
│   │   │   ├── [examId]
│   │   │   │   ├── layout.tsx
│   │   │   │   └── page.tsx
│   │   │   ├── _components
│   │   │   │   └── ContestTable.tsx
│   │   │   └── page.tsx
│   │   ├── exam
│   │   │   ├── [examId]
│   │   │   │   ├── layout.tsx
│   │   │   │   └── page.tsx
│   │   │   ├── _components
│   │   │   │   └── ExamTable.tsx
│   │   │   └── page.tsx
│   │   ├── inquiry
│   │   │   ├── [inquiryId]
│   │   │   │   └── page.tsx
│   │   │   ├── _components
│   │   │   │   └── InquiryTable.tsx
│   │   │   ├── layout.tsx
│   │   │   ├── page.tsx
│   │   │   └── write
│   │   │       ├── InquiryForm.tsx
│   │   │       └── page.tsx
│   │   ├── layout.tsx
│   │   ├── main
│   │   │   ├── _components
│   │   │   │   ├── MainBanner.tsx
│   │   │   │   ├── MainNotice.tsx
│   │   │   │   └── MainProblem.tsx
│   │   │   └── page.tsx
│   │   ├── notice
│   │   │   ├── [noticeId]
│   │   │   │   └── page.tsx
│   │   │   ├── _components
│   │   │   │   └── NoticeTable.tsx
│   │   │   ├── layout.tsx
│   │   │   └── page.tsx
│   │   ├── problem
│   │   │   ├── _components
│   │   │   │   └── ProblemTable.tsx
│   │   │   ├── feedback
│   │   │   │   └── [submissionId]
│   │   │   │       └── page.tsx
│   │   │   └── page.tsx
│   │   ├── profile
│   │   │   ├── @modal
│   │   │   │   ├── (.)withdrawal
│   │   │   │   │   └── page.tsx
│   │   │   │   └── default.tsx
│   │   │   ├── _components
│   │   │   │   ├── LanguageForm.tsx
│   │   │   │   ├── MemberProblemTable.tsx
│   │   │   │   ├── MemberSolProblemTable.tsx
│   │   │   │   ├── ProfileCard.tsx
│   │   │   │   └── RatingHelperCard.tsx
│   │   │   ├── layout.tsx
│   │   │   ├── page.tsx
│   │   │   ├── settings
│   │   │   │   ├── @modal
│   │   │   │   │   ├── (.)password
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   └── default.tsx
│   │   │   │   ├── layout.tsx
│   │   │   │   ├── page.tsx
│   │   │   │   └── password
│   │   │   │       └── page.tsx
│   │   │   └── withdrawal
│   │   │       └── page.tsx
│   │   └── ranking
│   │       ├── _components
│   │       │   └── RankingTable.tsx
│   │       └── page.tsx
│   ├── admin
│   │   ├── _components
│   │   │   ├── AiToken.tsx
│   │   │   ├── CodeViewer.tsx
│   │   │   ├── HealthCheck.tsx
│   │   │   ├── InquiryList.tsx
│   │   │   ├── SideAdminNav.tsx
│   │   │   └── TodaySubmission.tsx
│   │   ├── admin-manage
│   │   │   ├── _components
│   │   │   ├── edit
│   │   │   │   ├── _components
│   │   │   │   │   └── EditAdminForm.tsx
│   │   │   │   └── page.tsx
│   │   │   ├── enroll
│   │   │   │   ├── _components
│   │   │   │   │   └── CreateAdminForm.tsx
│   │   │   │   └── page.tsx
│   │   │   └── my-account
│   │   │       ├── _components
│   │   │       │   └── EditAdminMyAccountForm.tsx
│   │   │       └── page.tsx
│   │   ├── contest-manage
│   │   │   ├── edit
│   │   │   │   ├── @modal
│   │   │   │   │   ├── (.)testcase
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   └── default.tsx
│   │   │   │   ├── _components
│   │   │   │   │   ├── AddCandidate.tsx
│   │   │   │   │   ├── EditContestForm.tsx
│   │   │   │   │   └── ProblemForm.tsx
│   │   │   │   ├── layout.tsx
│   │   │   │   ├── page.tsx
│   │   │   │   └── testcase
│   │   │   │       └── page.tsx
│   │   │   ├── enroll
│   │   │   │   ├── @modal
│   │   │   │   │   ├── (.)testcase
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   └── default.tsx
│   │   │   │   ├── _components
│   │   │   │   │   ├── AddCandidate.tsx
│   │   │   │   │   ├── EnrollContestForm.tsx
│   │   │   │   │   └── ProblemForm.tsx
│   │   │   │   ├── layout.tsx
│   │   │   │   ├── page.tsx
│   │   │   │   └── testcase
│   │   │   │       └── page.tsx
│   │   │   ├── list
│   │   │   │   ├── _component
│   │   │   │   │   └── ContestManageTable.tsx
│   │   │   │   └── page.tsx
│   │   │   ├── page.tsx
│   │   │   └── result
│   │   │       ├── [testId]
│   │   │       │   ├── _components
│   │   │       │   │   └── ExamResult.tsx
│   │   │       │   └── page.tsx
│   │   │       └── list
│   │   │           └── [examId]
│   │   │               ├── _components
│   │   │               │   └── ExamResultList.tsx
│   │   │               └── page.tsx
│   │   ├── exam-manage
│   │   │   ├── _components
│   │   │   ├── edit
│   │   │   │   ├── @modal
│   │   │   │   │   ├── (.)testcase
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   └── default.tsx
│   │   │   │   ├── _components
│   │   │   │   │   ├── AddCandidate.tsx
│   │   │   │   │   ├── EditExamForm.tsx
│   │   │   │   │   └── ProblemForm.tsx
│   │   │   │   ├── layout.tsx
│   │   │   │   ├── page.tsx
│   │   │   │   └── testcase
│   │   │   │       └── page.tsx
│   │   │   ├── enroll
│   │   │   │   ├── @modal
│   │   │   │   │   ├── (.)testcase
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   └── default.tsx
│   │   │   │   ├── _components
│   │   │   │   │   ├── AddCandidate.tsx
│   │   │   │   │   ├── EnrollExamForm.tsx
│   │   │   │   │   └── ProblemForm.tsx
│   │   │   │   ├── layout.tsx
│   │   │   │   ├── page.tsx
│   │   │   │   └── testcase
│   │   │   │       └── page.tsx
│   │   │   ├── list
│   │   │   │   ├── _components
│   │   │   │   │   └── ExamManageTable.tsx
│   │   │   │   └── page.tsx
│   │   │   ├── page.tsx
│   │   │   ├── result
│   │   │   │   ├── [testId]
│   │   │   │   │   ├── _components
│   │   │   │   │   │   └── ExamResult.tsx
│   │   │   │   │   └── page.tsx
│   │   │   │   └── list
│   │   │   │       └── [examId]
│   │   │   │           ├── _components
│   │   │   │           │   └── ExamResultList.tsx
│   │   │   │           └── page.tsx
│   │   │   └── style.css
│   │   ├── inquiry-manage
│   │   │   ├── [inquiryId]
│   │   │   │   ├── _components
│   │   │   │   │   ├── Inquiryreply.tsx
│   │   │   │   │   └── Inquiryreplyempty.tsx
│   │   │   │   └── page.tsx
│   │   │   ├── _components
│   │   │   │   └── InquiryManageTable.tsx
│   │   │   ├── list
│   │   │   │   └── page.tsx
│   │   │   └── page.tsx
│   │   ├── layout.tsx
│   │   ├── notice-manage
│   │   │   ├── [noticeId]
│   │   │   │   ├── _components
│   │   │   │   │   └── NoticeDetailPage.tsx
│   │   │   │   └── page.tsx
│   │   │   ├── enroll
│   │   │   │   ├── _components
│   │   │   │   │   └── CreateNoticeForm.tsx
│   │   │   │   └── page.tsx
│   │   │   ├── list
│   │   │   │   ├── _components
│   │   │   │   │   └── NoticeManageTable.tsx
│   │   │   │   └── page.tsx
│   │   │   └── page.tsx
│   │   ├── page.tsx
│   │   ├── problem-manage
│   │   │   ├── _components
│   │   │   ├── edit
│   │   │   │   └── editor
│   │   │   │       ├── @modal
│   │   │   │       │   ├── (.)testcase
│   │   │   │       │   │   └── page.tsx
│   │   │   │       │   └── default.tsx
│   │   │   │       ├── _components
│   │   │   │       │   └── ProblemForm.tsx
│   │   │   │       ├── layout.tsx
│   │   │   │       ├── page.tsx
│   │   │   │       └── testcase
│   │   │   │           └── page.tsx
│   │   │   ├── enroll
│   │   │   │   └── editor
│   │   │   │       ├── @modal
│   │   │   │       │   ├── (.)testcase
│   │   │   │       │   │   └── page.tsx
│   │   │   │       │   └── default.tsx
│   │   │   │       ├── _components
│   │   │   │       │   └── ProblemForm.tsx
│   │   │   │       ├── layout.tsx
│   │   │   │       ├── page.tsx
│   │   │   │       └── testcase
│   │   │   │           └── page.tsx
│   │   │   ├── list
│   │   │   │   ├── _components
│   │   │   │   │   └── ProblemManageTable.tsx
│   │   │   │   └── page.tsx
│   │   │   └── page.tsx
│   │   ├── professor-manage
│   │   │   ├── _components
│   │   │   ├── edit
│   │   │   │   ├── _components
│   │   │   │   │   └── EditProfessorForm.tsx
│   │   │   │   └── page.tsx
│   │   │   ├── enroll
│   │   │   │   ├── _components
│   │   │   │   │   └── CreateProfessorForm.tsx
│   │   │   │   └── page.tsx
│   │   │   ├── list
│   │   │   │   ├── _components
│   │   │   │   │   └── ProfessorManageTable.tsx
│   │   │   │   └── page.tsx
│   │   │   └── page.tsx
│   │   └── user-manage
│   │       ├── _components
│   │       ├── edit
│   │       │   ├── _components
│   │       │   │   └── EditUserForm.tsx
│   │       │   └── page.tsx
│   │       ├── enroll
│   │       │   ├── _components
│   │       │   │   └── CreateUserForm.tsx
│   │       │   └── page.tsx
│   │       ├── list
│   │       │   ├── _components
│   │       │   │   └── userManageTable.tsx
│   │       │   └── page.tsx
│   │       └── page.tsx
│   ├── algorithm-ide
│   │   ├── @modal
│   │   │   ├── (.)setting
│   │   │   │   └── page.tsx
│   │   │   └── default.tsx
│   │   ├── [problemId]
│   │   │   └── page.tsx
│   │   ├── _components
│   │   │   ├── HistoryModal.tsx
│   │   │   ├── IdeFooter.tsx
│   │   │   ├── IdeGuestFooter.tsx
│   │   │   ├── IdeHeaderMemberDropdown.tsx
│   │   │   ├── IdeMain.tsx
│   │   │   ├── IdeProblemWindow.tsx
│   │   │   ├── IdeResultWindow.tsx
│   │   │   ├── ResultModal.tsx
│   │   │   └── TestcaseModal.tsx
│   │   ├── layout.tsx
│   │   └── setting
│   │       └── page.tsx
│   ├── globals.css
│   ├── layout.tsx
│   ├── loading.tsx
│   ├── not-found.tsx
│   ├── professor
│   │   ├── _components
│   │   │   ├── GachonOJShortCut.tsx
│   │   │   ├── GuideShortCut.tsx
│   │   │   ├── IncorrectAlgorithm.tsx
│   │   │   ├── IncorrectRateQuestions.tsx
│   │   │   ├── LanguageGraph.tsx
│   │   │   ├── OngoingExams.tsx
│   │   │   └── SideProfessorNav.tsx
│   │   ├── exam-manage
│   │   │   ├── edit
│   │   │   │   ├── @modal
│   │   │   │   │   ├── (.)testcase
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   └── default.tsx
│   │   │   │   ├── _components
│   │   │   │   │   ├── AddCandidate.tsx
│   │   │   │   │   ├── EditExamForm.tsx
│   │   │   │   │   └── ProblemForm.tsx
│   │   │   │   ├── layout.tsx
│   │   │   │   ├── page.tsx
│   │   │   │   └── testcase
│   │   │   │       └── page.tsx
│   │   │   ├── enroll
│   │   │   │   ├── @modal
│   │   │   │   │   ├── (.)testcase
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   └── default.tsx
│   │   │   │   ├── _components
│   │   │   │   │   ├── AddCandidate.tsx
│   │   │   │   │   ├── EnrollExamForm.tsx
│   │   │   │   │   └── ProblemForm.tsx
│   │   │   │   ├── layout.tsx
│   │   │   │   ├── page.tsx
│   │   │   │   └── testcase
│   │   │   │       └── page.tsx
│   │   │   └── list
│   │   │       ├── _components
│   │   │       │   └── ExamTable.tsx
│   │   │       └── page.tsx
│   │   ├── inquiry
│   │   │   ├── [InquiryId]
│   │   │   │   ├── _components
│   │   │   │   │   └── Inquiryreply.tsx
│   │   │   │   └── page.tsx
│   │   │   ├── list
│   │   │   │   ├── _components
│   │   │   │   │   └── InquiryTable.tsx
│   │   │   │   └── page.tsx
│   │   │   └── write
│   │   │       ├── _components
│   │   │       │   └── InquriyForm.tsx
│   │   │       └── page.tsx
│   │   ├── layout.tsx
│   │   ├── my-account
│   │   │   ├── _components
│   │   │   │   └── EditProfessorMyAccountForm.tsx
│   │   │   ├── page.tsx
│   │   │   └── withdrawl
│   │   │       └── page.tsx
│   │   └── page.tsx
│   └── test-ide
│       ├── @modal
│       │   ├── (.)setting
│       │   │   └── page.tsx
│       │   └── default.tsx
│       ├── [examId]
│       │   └── page.tsx
│       ├── _components
│       │   ├── HistoryModal.tsx
│       │   ├── IdeFooter.tsx
│       │   ├── IdeGuestFooter.tsx
│       │   ├── IdeHeaderMemberDropdown.tsx
│       │   ├── IdeMain.tsx
│       │   ├── IdeProblemWindow.tsx
│       │   ├── IdeResultWindow.tsx
│       │   ├── ResultModal.tsx
│       │   └── TestcaseModal.tsx
│       ├── layout.tsx
│       └── setting
│           └── page.tsx
├── components
│   ├── badge
│   │   ├── DiffBadge.tsx
│   │   └── RankBadge.tsx
│   ├── button
│   │   ├── CategoryButton.tsx
│   │   └── FullButton.tsx
│   ├── card
│   │   ├── AuthCard.tsx
│   │   ├── GuestProbCard.tsx
│   │   ├── MemberProbInfoCard.tsx
│   │   ├── MemberTestInfoCard.tsx
│   │   ├── ProfessorProblemCard.tsx
│   │   ├── ProfessorTestCard.tsx
│   │   ├── RecProblemCard.tsx
│   │   └── TestCard.tsx
│   ├── footer
│   │   └── SiteFooter.tsx
│   ├── header
│   │   └── IdeHeader.tsx
│   ├── modal
│   │   ├── ModalLarge.tsx
│   │   └── ModalSmall.tsx
│   ├── nav
│   │   └── manage
│   │       ├── AdminHeader.tsx
│   │       ├── BreadCrumbs.tsx
│   │       └── sidenav
│   │           └── SideNavAccount.tsx
│   └── pagination
│       ├── PaginationBar.css
│       └── PaginationBar.tsx
├── constants
│   ├── breadCrumbsMap.ts
│   ├── difficultyColorMap.ts
│   ├── memberConstants.ts
│   ├── programLangMap.ts
│   └── rankImageMap.ts
├── lib
│   ├── ReactQueryClient.tsx
│   ├── axiosConfig.ts
│   ├── columnHelper.tsx
│   ├── copyClipboard.tsx
│   └── utils.ts
├── mocks
│   ├── ADMIN_MOCK_DATA.json
│   └── PROBLEM_MOCK_DATA.json
├── next-env.d.ts
├── next.config.mjs
├── package.json
├── pnpm-lock.yaml
├── postcss.config.js
├── providers
│   └── theme-provider.tsx
├── public
│   ├── GCOJ.png
│   ├── fonts
│   │   ├── Pretendard-Black.ttf
│   │   ├── Pretendard-Bold.ttf
│   │   ├── Pretendard-ExtraBold.ttf
│   │   ├── Pretendard-ExtraLight.ttf
│   │   ├── Pretendard-Light.ttf
│   │   ├── Pretendard-Medium.ttf
│   │   ├── Pretendard-Regular.ttf
│   │   ├── Pretendard-SemiBold.ttf
│   │   └── Pretendard-Thin.ttf
│   ├── images
│   │   ├── banner
│   │   │   ├── banner_1_img.png
│   │   │   ├── banner_2_img.png
│   │   │   ├── banner_3_img.png
│   │   │   └── default_banner_img.png
│   │   ├── gachon_univ_image.png
│   │   ├── landing
│   │   │   ├── landing_ide_image.png
│   │   │   ├── landing_monitoring_image.png
│   │   │   ├── landing_prob_image.png
│   │   │   ├── landing_rank_image.png
│   │   │   └── landing_test_image.png
│   │   ├── logo
│   │   │   ├── gachonoj_logo.png
│   │   │   └── gachonoj_logo_white.png
│   │   ├── main_banner.png
│   │   └── rank
│   │       ├── rank0.png
│   │       ├── rank1.png
│   │       ├── rank2.png
│   │       ├── rank3.png
│   │       ├── rank4.png
│   │       └── rank5.png
│   ├── next.svg
│   └── vercel.svg
├── react-table-config.d.ts
├── store
│   ├── useProgramLangStore.ts
│   ├── useTestCaseStore.ts
│   └── useUserStore.ts
├── tailwind.config.ts
├── tsconfig.json
└── types
    ├── admin
    │   ├── admin.ts
    │   ├── contest.ts
    │   ├── dashboard.ts
    │   ├── exam.ts
    │   ├── inquiry.ts
    │   ├── notice.ts
    │   ├── problem.ts
    │   └── user.ts
    ├── auth.ts
    ├── inquiry.ts
    ├── member.ts
    ├── notice.ts
    ├── problem.ts
    ├── professor
    │   ├── dashboard.ts
    │   ├── exam.ts
    │   ├── inquiry.ts
    │   └── user.ts
    ├── rank.ts
    └── test.ts

📚 Skills

TypeScript Next.js Tailwind CSS

🪄 Environment

Vscode github

⚙️ CI/CD / Infra

Jenkins Docker

🤝 Team Collaboration Tool

Discord Slack Notion Google Drive Figma

© 2024 Gachon Univ. Online Judge. All Rights Reserved.

About

GachonOJ Project Frontend

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages