├── .editorconfig ├── .eslintignore ├── .gitignore ├── LICENSE ├── README.md ├── assets ├── nkuoj-favicon.ai ├── nkuoj-slogan.ai ├── readme-resources │ ├── admin.png │ ├── home.png │ ├── login.png │ └── submission.png └── readme.md ├── index.html ├── package-lock.json ├── package.json ├── public ├── favicon-tju.ico ├── favicon.ico ├── main.tju.css ├── nkuoj-slogan-light.svg ├── nkuoj-slogan.svg ├── pattern-light.svg ├── pattern.svg ├── qq-group.jpg ├── tjuoj-slogan-light.svg └── tjuoj-slogan.svg ├── src ├── App.vue ├── assets │ └── main.css ├── components │ ├── admin │ │ ├── CardManageProblem.vue │ │ ├── CardRanking.vue │ │ ├── CardRejudge.vue │ │ └── CardViewProblemSubmissions.vue │ ├── headbar │ │ ├── HeadBarAdmin.vue │ │ ├── HeadBarPublic.vue │ │ ├── HeadBarStrict.vue │ │ └── HeadBarUniversal.vue │ ├── icons │ │ ├── IconArrowClockwise.vue │ │ ├── IconArrowClockwiseSmall.vue │ │ ├── IconBoxArrowInUpRightSmall.vue │ │ ├── IconCheck2Circle.vue │ │ ├── IconCheckAll.vue │ │ ├── IconChevronDoubleRightSmall.vue │ │ ├── IconClipboardCheck.vue │ │ ├── IconClock.vue │ │ ├── IconClockHistory.vue │ │ ├── IconCodeSquare.vue │ │ ├── IconDownloadSmall.vue │ │ ├── IconEasel.vue │ │ ├── IconFileXLarge.vue │ │ ├── IconFunnelFillSmall.vue │ │ ├── IconFunnelSmall.vue │ │ ├── IconHouse.vue │ │ ├── IconJournalCode.vue │ │ ├── IconJournalPlus.vue │ │ ├── IconJump.vue │ │ ├── IconLightBulbSmall.vue │ │ ├── IconListColumnsReverse.vue │ │ ├── IconListOL.vue │ │ ├── IconMegaphone.vue │ │ ├── IconPDFLarge.vue │ │ ├── IconPencilSquare.vue │ │ ├── IconPerson.vue │ │ ├── IconReception.vue │ │ ├── IconReplySmall.vue │ │ ├── IconSend.vue │ │ ├── IconSendCheck.vue │ │ ├── IconSliders.vue │ │ ├── IconTrophy.vue │ │ ├── IconUIChecks.vue │ │ └── IconUIChecksGrid.vue │ ├── modal │ │ ├── ModalAddContestExam.vue │ │ ├── ModalAddCourse.vue │ │ ├── ModalAddCoursePasscode.vue │ │ ├── ModalAdminIndexProblem.vue │ │ ├── ModalAdminIndexProblemSet.vue │ │ ├── ModalAdminProblemNew.vue │ │ ├── ModalAdminSelectProblem.vue │ │ ├── ModalBase.vue │ │ ├── ModalCompilationOutput.vue │ │ ├── ModalConfirmBox.vue │ │ ├── ModalFilter.vue │ │ ├── ModalJumpToSubmission.vue │ │ ├── ModalLogin.vue │ │ ├── ModalMsgBox.vue │ │ ├── ModalMySubmissions.vue │ │ ├── ModalPreviewMarkdown.vue │ │ ├── ModalRejudgeProgressing.vue │ │ ├── ModalResetPwd.vue │ │ ├── ModalSignup.vue │ │ ├── ModalSubmissionStatusTracing.vue │ │ ├── ModalSubmitProblem.vue │ │ └── ModalUpdateProfile.vue │ ├── panels │ │ ├── PanelAssignment.vue │ │ ├── PanelBulletin.vue │ │ ├── PanelContestExam.vue │ │ ├── PanelCourse.vue │ │ ├── PanelJump.vue │ │ ├── PanelStrictContest.vue │ │ └── PanelStrictExam.vue │ ├── problem │ │ ├── ButtonSubmit.vue │ │ ├── CardProblemContent.vue │ │ └── DropdownNavigator.vue │ ├── ranking │ │ ├── RankingTableContest.vue │ │ └── RankingTableExam.vue │ ├── submission │ │ ├── CardCode.vue │ │ └── CardTestCase.vue │ └── wrapper │ │ ├── CardProgressBar.vue │ │ └── Pagination.vue ├── config.js ├── main.js ├── pages │ ├── AdminHomePage.vue │ ├── AdminProblemContentPage.vue │ ├── AdminProblemDataPage.vue │ ├── AdminProblemPage.vue │ ├── AdminProblemSpecialJudgePage.vue │ ├── AdminProblemSubmissionsPage.vue │ ├── AdminRejudgePage.vue │ ├── AlgoAssociationPage.vue │ ├── AssignmentPage.vue │ ├── BulletinContentPage.vue │ ├── BulletinPage.vue │ ├── ContestPage.vue │ ├── ContestRankingPage.vue │ ├── CoursePage.vue │ ├── ExamPage.vue │ ├── ExamRankingPage.vue │ ├── HomePage.vue │ ├── LoginPage.vue │ ├── LogoutPage.vue │ ├── NotFoundPage.vue │ ├── ProblemListPage.vue │ ├── ProblemPage.vue │ ├── ProfilePage.vue │ ├── SiteSubmissionPage.vue │ ├── StrictHomePage.vue │ └── SubmissionPage.vue ├── router │ └── index.js ├── stores │ ├── filter-data.js │ ├── strict-mode.js │ └── user-data.js ├── templates │ ├── AppAdmin.vue │ ├── AppPublic.vue │ ├── AppStrict.vue │ └── AppUniversal.vue └── util │ ├── compile-markdown.js │ ├── date-to-str.js │ ├── encrypt.js │ ├── http-code-to-str.js │ ├── lang-code-to-text.js │ ├── ordinal-number-to-str.js │ ├── status-code-to-str-short.js │ ├── status-code-to-str.js │ ├── status-code-to-variant-str.js │ └── uid-to-str.js └── vite.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /config/ 3 | /dist/ 4 | /*.js 5 | /test/unit/coverage/ 6 | /node_modules/ 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .github 3 | node_modules 4 | /dist 5 | 6 | 7 | # local env files 8 | .env.local 9 | .env.*.local 10 | 11 | # Log files 12 | npm-debug.log* 13 | yarn-debug.log* 14 | yarn-error.log* 15 | pnpm-debug.log* 16 | 17 | # Editor directories and files 18 | .idea 19 | .vscode 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Front End of NKU-OJ 2 | 3 |  4 |  5 |  6 |  7 | 8 | NKUOJ Front End is a website designed for the Online Judge System of Nankai University (NKU-OJ) with vue.js v3 and Vite. 9 | 10 | ## Features 11 | 12 | + Access control with all pages requiring user logged in; 13 | + An Embedded administrator dashboard (Under development); 14 | + Allowing users to list and view public problems; 15 | + Supporting users to subscribe courses, assignments, exams and contests; 16 | + Pages to view problems, courses, assignments, exams and contests in detail; 17 | + A profile page to view and edit user info; 18 | + Rank lists for exam and contest; 19 | + Multiple tabs and links on home page; 20 | + Supporting in-site announcements; 21 | + A page to view submissions with details of every test case and the submitted code; 22 | + All submissions on this site is visible in status page with a filter supported, if strict mode is disabled; 23 | + A strict mode user interface blocking every other pages except exam and contest. 24 | 25 | ## Recommended IDE Setup 26 | 27 | [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). 28 | 29 | ## Customize configuration 30 | 31 | See [Vite Configuration Reference](https://vitejs.dev/config/). 32 | 33 | ## Project Setup 34 | 35 | ```sh 36 | npm install 37 | ``` 38 | 39 | ### Compile and Hot-Reload for Development 40 | 41 | ```sh 42 | npm run dev 43 | ``` 44 | 45 | ### Compile and Minify for Production 46 | 47 | ```sh 48 | npm run build 49 | ``` 50 | 51 | ### Lint with [ESLint](https://eslint.org/) 52 | 53 | ```sh 54 | npm run lint 55 | ``` 56 | 57 | ## Compatible Back End 58 | 59 | [ArcOJ-BackEnd](https://github.com/ArcanusNEO/ArcOJ-BackEnd) 60 | -------------------------------------------------------------------------------- /assets/nkuoj-favicon.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NankaiACM/NKUOJ-Front-End/1ccc302bce20b5980c209b09a1be7dc02783d3d2/assets/nkuoj-favicon.ai -------------------------------------------------------------------------------- /assets/nkuoj-slogan.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NankaiACM/NKUOJ-Front-End/1ccc302bce20b5980c209b09a1be7dc02783d3d2/assets/nkuoj-slogan.ai -------------------------------------------------------------------------------- /assets/readme-resources/admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NankaiACM/NKUOJ-Front-End/1ccc302bce20b5980c209b09a1be7dc02783d3d2/assets/readme-resources/admin.png -------------------------------------------------------------------------------- /assets/readme-resources/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NankaiACM/NKUOJ-Front-End/1ccc302bce20b5980c209b09a1be7dc02783d3d2/assets/readme-resources/home.png -------------------------------------------------------------------------------- /assets/readme-resources/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NankaiACM/NKUOJ-Front-End/1ccc302bce20b5980c209b09a1be7dc02783d3d2/assets/readme-resources/login.png -------------------------------------------------------------------------------- /assets/readme-resources/submission.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NankaiACM/NKUOJ-Front-End/1ccc302bce20b5980c209b09a1be7dc02783d3d2/assets/readme-resources/submission.png -------------------------------------------------------------------------------- /assets/readme.md: -------------------------------------------------------------------------------- 1 | ### Global Assets 2 | 3 | **Note: assets under this directory is excluded from the project.** 4 | 5 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 |创建、修改、克隆题目和上传下载数据。
6 |查看考试、竞赛榜单。
6 |对题目的所有提交或者单个提交进行重测。
6 |查看和下载题目完成数据。
6 |正在提交重测...完成{{successRejudges}},失败{{failedRejudges}},正在提交{{submittingRejudges}}
13 |已经完成重测。成功{{successRejudges}},失败{{failedRejudges}}
14 |所有失败的重测:
{{JSON.stringify(this.failedSubmissions)}}
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |{{code}}
26 | 30 | 您没有权限查看该代码,可能是由于以下原因: 31 |
32 |10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |34 | 无法查看测试点详情,可能是由于以下原因: 35 |
36 |8 | 管理题目、作业、比赛、考试、用户等。 9 |
10 |
8 | 题目:#{{ this.$route.params.id }} |
9 |
8 | 题目:#{{ this.$route.params.id }} |
9 |
Special Judge 分为比较和交互两种模式。对于比较模式,Special Judge 程序将在用户程序执行结束后运行。
14 |参数为:
15 |评测结果:
22 |7 | 公告 #{{ this.$route.params.id }} | {{getLocaleDate(announcement.time)}} 8 |
9 |{{announcement.content}}11 |
8 | 站务消息,包括维护通知、运行状态等。 9 |
10 |
7 | 竞赛 #{{ this.$route.params.id }} |
12 | 您可以快速跳转到题目和提交记录。如需查看完整用户名,请选中后复制。 13 |
14 |
7 | 考试 #{{ this.$route.params.id }} |
12 | 您可以快速跳转到题目和提交记录。如需查看完整用户名,请选中后复制。 13 |
14 |8 | 您可以在此挑选题目练习。此处题目不会计入课程成绩。 9 |
10 |7 | 题目 | #{{ this.$route.params.id }} 8 |
9 |题目名:{{ problemInfo.name }}
24 |编号:{{ $route.params.id }}
25 |测试点:{{ problemInfo.cases }}
26 |时间限制:{{ problemInfo.timeLimit }} ms
27 |空间限制:{{ problemInfo.memoryLimit }} KiB
28 |完成状态:{{ ['未提交', '未通过', '已通过'][problemInfo.status] }}
29 |通过率:{{ problemInfo.submitAc }} / {{ problemInfo.submitAll }}
30 |评测全部测试点:{{ problemInfo.detailJudge ? '是' : '否' }}
31 |Special Judge:{{ ['未启用', '比较模式', '交互模式'][problemInfo.specialJudge] }} 32 |
33 |8 | 查看和修改个人信息。 9 |
10 |7 | #{{ this.$route.params.id }} 8 |
9 |编号:{{ $route.params.id }}
22 |用户:[u:{{ getUserIdText(data.uid) }}] @{{ data.nickname }}
23 | 24 |时间:{{ getLocaleDate(data.when) }}
25 |公开:{{ data.share ? '是' : '否' }}
26 |语言:{{ getLangText(data.langId) }}
27 |用时:{{ data.runTime }} ms
28 |内存:{{ data.runMemory }} KiB
29 |编译:查看编译信息
30 |判定:{{getStatusText(data.statusId)}}
31 |分数:{{data.score}}分
32 |