├── .gitignore ├── .prettierrc ├── .vscode └── extensions.json ├── README.md ├── components.d.ts ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── ccuplus.svg ├── favicon.ico ├── member01.jpg ├── member02.jpg ├── member03.jpg ├── member04.png ├── search_box_icon.png └── vite.svg ├── samole.env ├── src ├── App.vue ├── assets │ ├── logo.png │ └── vue.svg ├── components │ ├── common │ │ ├── ClipLoadingSpinner.vue │ │ ├── error_box.vue │ │ ├── loadingSpinner.vue │ │ ├── option │ │ │ └── commonOption.vue │ │ └── optionButton │ │ │ └── kebabButton.vue │ ├── layout │ │ ├── footer.vue │ │ └── navbar.vue │ └── pages │ │ ├── home │ │ ├── intro.vue │ │ └── notify.vue │ │ ├── login │ │ └── loginarea.vue │ │ ├── main │ │ ├── classTable.vue │ │ ├── colorTemplate.vue │ │ ├── comment.vue │ │ ├── courseCard.vue │ │ ├── course_tab.vue │ │ ├── inputArea.vue │ │ ├── modal.vue │ │ ├── search_box.vue │ │ ├── serach_modes │ │ │ ├── course_name.vue │ │ │ ├── custom.vue │ │ │ ├── department.vue │ │ │ ├── teacher.vue │ │ │ └── time.vue │ │ └── timeSelection.vue │ │ └── tutorial │ │ └── tutorial.vue ├── css │ └── style.css ├── functions │ ├── ccuplus.ts │ ├── course_add.ts │ ├── course_color.ts │ ├── course_delete.ts │ ├── course_search.ts │ ├── general.ts │ ├── image_render.ts │ ├── rowspanizer.ts │ ├── save_course.ts │ ├── token.ts │ ├── tool.ts │ └── web_statistic.ts ├── main.ts ├── router │ └── index.ts ├── store │ ├── ccuplus.ts │ ├── course.ts │ ├── general.ts │ └── index.ts ├── views │ ├── page_admin.vue │ ├── page_error.vue │ ├── page_home.vue │ ├── page_login.vue │ ├── page_main.vue │ ├── page_record_error.vue │ └── page_tutorial.vue └── vite-env.d.ts ├── tailwind.config.js ├── tsconfig.json ├── tsconfig.node.json ├── vite.config.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | /server 15 | 16 | # Editor directories and files 17 | .vscode/* 18 | !.vscode/extensions.json 19 | .idea 20 | .DS_Store 21 | *.suo 22 | *.ntvs* 23 | *.njsproj 24 | *.sln 25 | *.sw? 26 | .env 27 | 28 | src/css/tailwind.css -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "always", 3 | "bracketSameLine": true, 4 | "bracketSpacing": true, 5 | "semi": true, 6 | "experimentalTernaries": false, 7 | "singleQuote": false, 8 | "jsxSingleQuote": false, 9 | "quoteProps": "as-needed", 10 | "trailingComma": "all", 11 | "singleAttributePerLine": false, 12 | "htmlWhitespaceSensitivity": "css", 13 | "vueIndentScriptAndStyle": false, 14 | "proseWrap": "preserve", 15 | "insertPragma": false, 16 | "requirePragma": false, 17 | "tabWidth": 2, 18 | "useTabs": false, 19 | "embeddedLanguageFormatting": "auto", 20 | "printWidth": 70 21 | } 22 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pineapple Schedule - A simple schedule web for CCU students 2 | 3 | ## Local development 4 | 5 | ### Prerequisites 6 | 7 | - [Node.js](https://nodejs.org/en/) (>= 10.16.0) 8 | - [npm](https://www.npmjs.com/) (>= 6.9.0) 9 | 10 | ### Installation 11 | 12 | ```bash 13 | npm install 14 | ``` 15 | 16 | ### Run 17 | 18 | ```bash 19 | npm run dev 20 | ``` 21 | 22 | ### Build 23 | 24 | ```bash 25 | npm run build 26 | ``` 27 | 28 | If you encounter the error "Could not find a declaration file for module 'vuex' during the build process, please refer to this article: https://github.com/vuejs/vuex/issues/2223 . 29 | 30 | ### Preview 31 | 32 | ```bash 33 | npm run preview 34 | ``` 35 | 36 | 37 | ### Tailwind CSS Hot Reload 38 | 39 | ```bash 40 | npm run hotfix 41 | ``` 42 | 43 | ## How to use backend API 44 | 45 | Rename the file "samole.env" in the directory to ".env" and make sure to use one of the following during runtime: localhost:5173, localhost:5585, localhost:8080. 46 | -------------------------------------------------------------------------------- /components.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* prettier-ignore */ 3 | // @ts-nocheck 4 | // Generated by unplugin-vue-components 5 | // Read more: https://github.com/vuejs/core/pull/3399 6 | export {} 7 | 8 | declare module 'vue' { 9 | export interface GlobalComponents { 10 | ClassTable: typeof import('./src/components/pages/main/classTable.vue')['default'] 11 | ClipLoadingSpinner: typeof import('./src/components/common/ClipLoadingSpinner.vue')['default'] 12 | ColorTemplate: typeof import('./src/components/pages/main/colorTemplate.vue')['default'] 13 | Comment: typeof import('./src/components/pages/main/comment.vue')['default'] 14 | CommonOption: typeof import('./src/components/common/option/commonOption.vue')['default'] 15 | Course_name: typeof import('./src/components/pages/main/serach_modes/course_name.vue')['default'] 16 | Course_tab: typeof import('./src/components/pages/main/course_tab.vue')['default'] 17 | CourseCard: typeof import('./src/components/pages/main/courseCard.vue')['default'] 18 | Custom: typeof import('./src/components/pages/main/serach_modes/custom.vue')['default'] 19 | Department: typeof import('./src/components/pages/main/serach_modes/department.vue')['default'] 20 | Error_box: typeof import('./src/components/common/error_box.vue')['default'] 21 | Footer: typeof import('./src/components/layout/footer.vue')['default'] 22 | InputArea: typeof import('./src/components/pages/main/inputArea.vue')['default'] 23 | Intro: typeof import('./src/components/pages/home/intro.vue')['default'] 24 | KebabButton: typeof import('./src/components/common/optionButton/kebabButton.vue')['default'] 25 | LoadingSpinner: typeof import('./src/components/common/loadingSpinner.vue')['default'] 26 | Loginarea: typeof import('./src/components/pages/login/loginarea.vue')['default'] 27 | Modal: typeof import('./src/components/pages/main/modal.vue')['default'] 28 | Navbar: typeof import('./src/components/layout/navbar.vue')['default'] 29 | Notify: typeof import('./src/components/pages/home/notify.vue')['default'] 30 | RouterLink: typeof import('vue-router')['RouterLink'] 31 | RouterView: typeof import('vue-router')['RouterView'] 32 | Search_box: typeof import('./src/components/pages/main/search_box.vue')['default'] 33 | Teacher: typeof import('./src/components/pages/main/serach_modes/teacher.vue')['default'] 34 | Time: typeof import('./src/components/pages/main/serach_modes/time.vue')['default'] 35 | TimeSelection: typeof import('./src/components/pages/main/timeSelection.vue')['default'] 36 | Tutorial: typeof import('./src/components/pages/tutorial/tutorial.vue')['default'] 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 18 |52 | 創辦人 吳翰平 53 |
54 |55 | 現在就讀於中正大學資訊工程學系四年級, 56 | 目前正在鑽研程式演算法競賽與網頁前後端工程, 57 | 負責本網站的前端工程,是一位 Vue 新手。 58 |
59 |73 | 王子銜 74 |
75 |76 | 中正大學通訊工程學系四年級, 77 | 主要研究網頁前後端與演算法競賽。 2023 中研院 Summer 78 | intern 79 |
80 |94 | 楊其龍 95 |
96 |97 | 中正大學資訊工程學系四年級 98 | 主要研究軟體工程、網頁前後端、競程, 目前主要學習ML, 99 | 此專案主要負責後端伺服器、資料庫、API。 100 |
101 |115 | 凃昀辰 116 |
117 |118 | 現在就讀於資訊工程學系四年級, 119 | 主要研究跨域資訊安全與CTF, 目前主要為學習ML相關知識。 120 |
121 |
13 | 除了之前新增的
14 | 時間課程搜尋和教師名稱系所搜尋
17 | 功能,
18 | 現在我們可以檢視
20 | 近幾學期的歷史課程了!
22 | 另外,也新增多組課表功能,用來做不同組合的編排。
23 |
24 | 如發生顯示問題可以嘗試重新整理頁面或清空課表重建,也可以回報發生問題的選課組合,我們會盡快修復!
25 | 同時要請手機使用者多多包涵,為了實現更多功能,
26 | 目前手機版的網頁版面不太完善,請使用電腦版瀏覽器以獲得更好的使用體驗,
27 | 手機板的優化將在下個大版本進行,敬請期待!
28 |
7 | 目前學分: {{ TotalCourseData[activeIndex].credit }} 8 |
9 |⠀ | 114 |節次 | 115 |星期一 | 116 |星期二 | 117 |星期三 | 118 |星期四 | 119 |星期五 | 120 |星期六 | 121 ||
---|---|---|---|---|---|---|---|---|
70 | 目前學分: {{ TotalCourseData[activeIndex].credit }} 71 |
72 |73 | Hint: 74 | 課程教室、課程時間皆可點擊選擇顯示其他資訊 75 |
76 |81 | 課程名稱 82 | | 83 |85 | 95 | | 96 |98 | 108 | | 109 |111 | 操作 112 | | 113 |
---|---|---|---|
{{ item.getCourseName() }} | 120 |{{ item.displayField1 }} | 121 |{{ item.displayField2 }} | 122 |123 | 128 | | 129 |
15 | 請問你是要新增一個空白課表還是複製一個現有的課表? 16 |
17 |課程ID: {{ selectedCourse.id }}
56 |課程名稱: {{ selectedCourse.class_name }}
57 |教師: {{ selectedCourse.teacher }}
58 |學分: {{ selectedCourse.credit }}
59 |教室: {{ selectedCourse.class_room }}
60 |時間: {{ selectedCourse.class_time }}
61 |課程ID: {{ selectedCoursesearchtime.id }}
72 |73 | 課程名稱: {{ selectedCoursesearchtime.class_name }} 74 |
75 |教師: {{ selectedCoursesearchtime.teacher }}
76 |學分: {{ selectedCoursesearchtime.credit }}
77 |教室: {{ selectedCoursesearchtime.class_room }}
78 |時間: {{ selectedCoursesearchtime.class_time }}
79 |22 | 除了最新年度的課程外,我們也提供了歷年的課程資料,可以在搜尋欄中選擇年度。 23 |
24 |29 | 在搜尋欄中輸入課程名稱,即可搜尋到相關課程。 30 |
31 |36 | 在搜尋欄中輸入科系,會用科系搜尋相關課程,並且可以用年級、向度等方式進行篩選。 37 |
38 |43 | 在搜尋欄中輸入教師名稱,會用教師名稱搜尋相關課程。 44 |
45 |50 | 自行輸入課程名稱,可以用來規劃社團或其他活動的時間。 51 |
52 |57 | 為了讓大家更方便尋找空堂時間的課程,我們提供了以時間搜尋課程的功能, 58 | 在開啟時間搜尋模式後,可以直接在課表上對應的位置用左鍵拖拉來選擇時間, 59 | 右鍵確認選擇後,即可搜尋到相關課程。 60 |
61 |66 | 為了讓大家更方便搜尋課程,我們提供了浮動搜尋欄的功能, 67 | 當使用者在下方課表區域時,左邊會有一個可以縮放的搜尋欄, 68 | 可以在此搜尋課程,並且可以直接將課程加入課表。 69 |
70 |
75 | 為了讓大家更方便選擇課程, 本站和 CCU Plus
76 | 合作,提供了課程評價的功能,
77 | 當使用者在下方課表區域時,可以點擊課程,在課程翻轉後顯示的功能表內
78 | 提供了查看課程評價的功能。
79 | 另外,在浮動搜尋欄跟時間搜尋功能中,也提供在選擇課程前可以查看課程評價的功能。
80 |
91 | 在課表製作頁面,可以將點選下載課表儲存,並且可以在下次開啟時直接載入, 92 | 只要在同一裝置的同瀏覽器,就可以保存你的所有課表資訊。 93 |
94 |99 | 在課表製作頁面,可以將點選分享課表,會產生一個網址,可以分享給其他人, 100 | 這個網址可以直接開啟課表,但是無法修改課表。 101 |
102 |107 | 為了方便大家在排課時安排多種方案,或者紀錄朋友的課表,我們提供了多課表製作的功能, 108 | 可以在課表製作頁面新增多個課表,並且可以在不同課表間切換。 109 |
110 |115 | 在課表頁面,點選指定的課程,可以將課程翻轉,並且可以在課程翻轉後顯示的功能表內 116 | 修改課程格子的顏色,以及修改文字的顏色,提供更多的課表美化選項。 117 |
118 |123 | 在課表頁面,點選頁面中的顯示學分,可以顯示目前課表中的學分總數, 124 | 除了自定義課程外,其他課程都會顯示學分,並且會計算進總學分中。 125 |
126 |
21 | 因篇幅關係,本介面僅顯示前四層的評論,
24 |22 | 若有需要請至最下方的查看更多查看評價之留言。 23 |
34 |
60 |
86 |
115 |
151 | 此門課查無評價或發生問題 152 |
153 |