2021資料庫系統專題: 政大課程評價系統
===
[TOC]
### 專題題目、組名
### 組長及組員姓名學號與系級
### 每位成員負責之任務分工、貢獻百分比
### 需求分析
政大的學生目前在選課的時候,若是想知道某堂課的評價,目前的做法有2種
1. 加到追蹤清單後,查看使用政大官方上傳的評價
2. 自己google
我們認為政大缺乏一個統一的課程評價平台,
所以我們決定開發一個統整所有政大課程資訊的平台
希望能解決同學在選課時資訊不足的問題
### 系統功能
主要的功能包含瀏覽課程跟課程評價,上傳修改跟刪除課程評價,
另外,與一般課程評價網站不同的是多了以下幾個功能:
1.留言板(課程底下有留言板可以交流)
2.貼文版(使用者可以發布貼文)
3.收藏課程(使用者可以將課程收藏)
4.課程尋找過濾器(提供親切的圖形介面供使用者過濾出自己想找的課程)
5.課程資源分享(同學能分享筆記跟考古題)
6.二手書交易(此功能的前端尚未實作,不過有先規劃資料庫,未來可能會移除此功能)
### ER Model
//畫圖
### Relational Schema
//畫圖
### 系統架構
//放圖
### 心得
## 成員
資科三 謝惟寧
資科三 李順斌
資科三 郭沛澐
資科四 鄭家宇
金融四 陳冠全
資科四 張昱威
資科四 陶亮清
## 工作分配
謝惟寧、李順斌:12/12前 資料需求分析、系統功能分析
陶亮清、陳冠全:12/19前 ER model, Relational Schema設計報告
鄭家宇、張昱威、郭沛澐:12/26前 系統架構(系統功能、開發的程式語言、DBMS與工具、系統模組)
## 開發問題
1. 政大課程查詢抓下來excel檔沒有照 "必/選修"、"整開"、"通識"、"體育/國防" 分 需要自己分類
2. 抓不到過去幾學年的資料
3. 沒有系上教授資料
4. Professor
### 基本feature
一個web app
提供政大學生(有@g.nccu.edu.tw帳號的人才行)
課程評價跟課程資源分享,
功能包含上傳跟瀏覽課程評價(統計過的)
還有分享課程資源(上傳/下載檔案)
(課程資料是齊全且整理過的)
### 進階feature
為GDSC選課系統專案提供課程評價(提供資料庫裡的資料)
學生可以crud自己的發表跟分享並幫其他貼文按讚(類似FB)
//以下目標還在計畫當中,不會實作
學生彼此可以聊天(政大選課+交流平台)(類似可以聊天的DCARD)
學生彼此可以交易(政大電商平台)(類似蝦皮)
## Schema
user
course
courseFeedBack
professor: name, self_URL, lab_URL, 職位, e-mail, 學歷, 大頭照, department
department: name, URL, location, professors
------------------------------
## 簡單的開發進度時間表
**1/11期末考**


## PDF
[12/12](https://github.com/niummxvy/Course_Evaluation/blob/main/Introduction.pdf)
[12/19](https://github.com/niummxvy/Course_Evaluation/blob/main/ER%20Model%20%26%20Relational%20Schema%20Design%20Report.pdf)
[12/26](https://github.com/niummxvy/Course_Evaluation/blob/main/System%20Architecture.pdf)
--------------------------------
# 以下資料供上台ppt跟作業pdf製作參考:
系統架構 系統功能 程式語言 DBMS 工具 系統模組 開發上的問題:
### 前端:
使用 React.js + material UI.js
### 後端:
使用 express.js
### DBMS:
使用mongo db
使用 mongoose.js 進行資料CRUD
### 使用到的第三方API:
google AUTH(google 第三方認證登入API)
### 使用到的cloud hosting service
暫時使用heroku的免費方案放置前端web app跟後端server
正在嘗試改為使用AWS
使用mongo atlas免費方案作為雲端資料庫
### 架構圖:
(待補.. 12/25號前會補上 by 惟寧)
### 系統功能/來源:
以從政大課程查詢網抓下來的excel課程檔為核心,加上使用者登入登出系統,
拼湊成一個課程評價網,主要的功能包含瀏覽課程跟課程評價,上傳修改跟刪除課程評價,
另外,與一般課程評價網站不同的是多了以下幾個功能:
1.留言板(課程底下有留言板可以交流)
2.貼文版(使用者可以發布貼文)
3.收藏課程(使用者可以將課程收藏)
4.課程尋找過濾器(提供親切的圖形介面供使用者過濾出自己想找的課程)
5.二手書交易(此功能的前端尚未實作,不過有先規劃資料庫,未來可能會移除此功能)
### 開發難點:
##### 1.資料來源:
1-A.目前需要個電算中心要過去年份的課程excel檔,不然目前只有110學年上學期的課程資料
1-B.更完整的資料,我們希望能有教授(professor)跟系所(department)的完整詳細資料,這樣本網站便可以提供關於修課更詳細的資料並給使用者做討論
##### 2.經費:
免費的cloud hosting server速度慢,影響使用者體驗
##### 3.使用者行為
因為有提供檔案上傳功能,對超出預期的使用者行為目前沒有對應的處理方法(例如:使用者張貼教授不希望公開的東西)
##### 4.資訊安全:
無法保證本網站不會被駭入,所以使用第三方登入系統,仍然有學號,頭貼,EMAIL等私密資料會被本網站存取
### DEMO網址:
([點此](https://nccucourseguide.herokuapp.com/integrated))
### 資料處理:
從政大課程excel檔開始,觀察9碼科目代碼的編碼規律,先簡單將課程分類成係開 整開 通識 體育 後,再細分成不同子類別 e.g.通識可再分成人文/社會/自然
然而,若要擴展成一個能提供教授跟系所等其他詳細資料的網站,只靠此課程表的資料仍遠遠不足,所以在資料庫規劃跟實作上有不同,不同的地方詳細如下:
1.規劃:
共有
Department(系所)
professor(教授) 以department為外來鍵(一個教授僅屬於一個科系)
course(課程) 以department跟professor為外來鍵
user(使用者)
userFeedback(課程評價) 以user跟course為外來鍵
userResource(課程資源) 以user跟course為外來鍵
userPost(使用者貼文)
照上面的規劃:
使用course join professor跟department 即可保證提供的課程資料是最新的,
且教授資料更新時,僅需要更新professor這張table,不需要連同更新course
若為效能考量,不想要每次查詢課程時需要等待join資料表的時間,也可定期執行query將完整的課程資料寫入一張快取資料表,省去大query的等待時間
2.實際情況:
共有
course(課程)
user(使用者)
userFeedback(課程評價) 以user跟course為外來鍵
userResource(課程資源) 以user跟course為外來鍵
userPost(使用者貼文)
因為沒有跟學校要到教授跟系所得詳細資料,所以照規劃設計資料庫,它的department跟professor是沒有資料的
所以我們直接將課程資料excel檔轉成csv檔後再放入資料庫,使得這張資料表沒有外來鍵也沒有其他資料表可以join,
使得本網站可以提供的資料僅有課程,沒有教授跟系所等資料
## 1/1 小組會議:分配code
Google API:向Google發送request,得到response
MVC(Model, View, Controller): 舉廚房的例子,
Model=models:食材;
View=router:點菜/客人:提出request,接收廚師的response;
Controller=controllers:後台/廚師:接收客人的request,用models的食材做出客人的需求,再response給客人
有一些js檔是MVC都有,形成pipeline
`Course.find({type:type, semester}) // find回傳多個,findOne回傳一個`
->`SELECT type, semester FROM Course`
~~user: GoogleSignIn~~
xlsx -> csv -> js
每人:資料庫、API規劃與設計、大家一起做功能設計
~~code是其他組員協助完成的~~ 已分工,看最下面
course, courseFeedBack. courseResource是最主要的
順斌:Professor, department
主要執行檔為`index.js`
`index.js`
`app.use('/course', courseRoutes); // 有關/course的連接是由courseRoutes這個路由器負責()`
`course.js`
`router.post('/department', getCoursesByDepartment); // 有關於/department的資料取得,是由getCoursesByDepartment負責`
`.post`把資料放body
`.get`直接把資料放到網址上(`?`後面的東西)
`router.use(function(req, res, next) {`
` res.header("Access-Control-Allow-Origin", "*"); `
` // update to match the domain you will make the request from`
` // res.header("Access-Control-Allow-Headers", Origin, X-Requested-With, Content-Type, Accept");`
` next();`
` }); // 可以進來的網域有哪些`
`mongoose`: 和資料庫連接
## 小組分工表
惟寧: 前端
亮清: courseFeedBack
昱威: courseResource
冠全: user
順斌: csv
沛澐: post
家宇: course