---
# System prepended metadata

title: Database 期末專題 小組討論

---

# DataBase 期末專題 小組討論

:::warning
**Github Account**
 https://github.com/DBMSTeam8/DBMS-Final-Project

**Github Admin Token(Password)**
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

Use this to commit changes to github
:::


成員列表：
| 112550019 | 112550047 | 112550059 | 112550099 | 112550131 |
| -------- | -------- | -------- | -------- | -------- | 
| 謝嘉宸     | 徐瑋晨     | 林佑丞     | 蔡烝旭     | 張詠晶     |
## Descriptions of our data
### Introduction to the data
資料集包含七個檔案(6個.csv file、 1個.geojson file)，每個檔案儲存有關於地點位於New York City的AirBnB之相關資料，以下是資料檔案內容說明：
1. calendar.csv(740.43 MB)
    >此資料檔案主要儲存各AirBnB的訂房與價位狀態，內含有日期資料、是否接受訂房、價錢資訊及最短與最長過夜天數限制等資料。
2. listings.csv(6.64 MB)
    >此資料檔案主要儲存AirBnB主人資訊及房間類型與評論相關的資料，內部含有主人姓名、AirBnB地點、房型及評論次數等資料。
3. listings_detailed.csv(103.49 MB)
    >此資料檔案主要儲存顧客對房間留下的各式評論。
7. neighbourhoods.csv(4.96 kB)
    >此資料檔案主要儲存紐約各個街區對應至紐約的哪個行政區。
9. reviews.csv(22.68 MB)
    >此資料檔案主要儲存評論產生的日期。
11. reviews_detailed.csv(344.63 MB)
    >此資料檔案主要儲存顧客對房間留下的各式評論。
13. neighbourhoods.geojson(634.17 kB)
    >此資料檔案主要儲存AirBNB的經緯座標
### Where is the data from
資料集來自於kaggle上的[Inside AirBnB-USA](https://www.kaggle.com/datasets/konradb/inside-airbnb-usa)
### Meaning of columns and tables
:::warning
這邊可能需要畫圖、describe table、column敘述
可以用[dbdiagram.io](https://dbdiagram.io/home)畫圖
:::

:::info
**Alter Table Cmd**
ALTER TABLE <table-name>
MODIFY COLUMN <col-name> <type>;

ex. The command to modify the database
    
    ALTER TABLE users MODIFY COLUMN id VARCHAR(255) NOT NULL;
    ALTER TABLE review_detail MODIFY COLUMN reviewer_id VARCHAR(255) NOT NULL;
    
:::
#### Overview

![dbda](https://hackmd.io/_uploads/rkMG1umQJe.png)



### Others
目前暫時以AirBNB的基本操作為主軸，未來可能再擴充安全指標、餐廳推薦、交通資訊等功能

[別人の成品，可供參考](https://insideairbnb.com/new-york-city/)
## Source of our data
Source: ( * 表示未來有可能擴充的功能 )
1. [USA AirBNB](https://www.kaggle.com/datasets/konradb/inside-airbnb-usa)
2. [*NYPD arrests and crime dataset](https://www.kaggle.com/datasets/kamaravichow/nypd-arrests-and-crime-dataset)
4. [*National Register of Historic Places Map(for recreation)](https://data.ny.gov/Recreation/National-Register-of-Historic-Places-Map/y36f-mkpp)
5. [*NYC Transit Subway Entrance And Exit Data](https://www.kaggle.com/datasets/new-york-state/nys-nyc-transit-subway-entrance-and-exit-data?select=nyc-transit-subway-entrance-and-exit-data.csv)
6. [*New York City Restaurant Inspection](https://www.kaggle.com/datasets/minisam/new-york-city-restaurant-inspection20172021?select=DOHMH_New_York_City_Restaurant_Inspection_Results.csv)
## Application Design
### Main idea
假設情境：你是一個即將來紐約的旅客。你想找個便宜、地理位置優良、安全的地方落腳，但卻發現自己無從找起。我們希望改善他的窘境。

我們希望訪客使用我們的資料庫時，他們可以根據諸多數據綜合做出最佳居住地點的決策。我們列入考慮的選擇因子包含但不限於：

* 犯罪紀錄
* 餐廳位置
* 交通資訊 （To be updated） 

其中訪客也可以對這個資料庫做出貢獻，即上傳自己的居住經驗供來人參考。
### Functionality
1. 搜尋(Airbnb、*餐廳、*交通資訊)
2. 新增、修改、刪除評論(Airbnb)
4. 推薦評分最高的(Airbnb、*餐廳)
5. *提供安全資訊(依危險指數用顏色分級)
6. *提供鄰近的地鐵站資訊
:::danger
使用者可以變更的部分會以review_detail 這份資料為主，以下為各attribute的說明
listing_id : 使用者要用它來找飯店
id: 對我們來說是一個 0 < x < 1000 的random 數字
date: 當下時間
reviewer_id: 使用者輸入密碼
reviewer_name: 使用者輸入帳號
comments: 使用者輸入評論

-> 使用者一共會輸入三行東西， 當中若reviewer_id 產生重複，則重新產生資料已存在， 請重新輸入
:::

:::info
「*」意義： 擴充功能，敬請期待
優先級順序：安全指標(犯罪紀錄) -> 交通資訊 -> 餐廳位置
:::

#### User
> 訪客模式 —— 功能為查詢既有資料、匿名評論。




### Interface
![mainpage](https://hackmd.io/_uploads/ryYD2P7m1e.jpg)
![modifyreview](https://hackmd.io/_uploads/SJ4dhP7X1l.jpg)
![editreview](https://hackmd.io/_uploads/BkjuhPQQ1l.jpg)
![searchhotel](https://hackmd.io/_uploads/BJjF2vX7yl.jpg)
![hotelpage](https://hackmd.io/_uploads/H15c3vX7kl.jpg)
![hoteldetail](https://hackmd.io/_uploads/SJ-s3wmXkg.jpg)
![addcomment](https://hackmd.io/_uploads/r1nonvmX1x.jpg)


#### Main Page

背景：NYC行政區域圖
顯示資訊：日期&時間
要求輸入欄位：

* 查住宿：輸入紐約城區 & 居住時間長短 & 房型
    * 選擇性勾選欄位：優先級（擴充包內容）

* 留評論：輸入紐約城區、居住時間長短、房型、旅店名字
* 修改評論：輸入評論ID，進入修改頁面

:::info
**優先級**
因為可能UI只能顯示一些旅店的選項，因此可能應該需要實作某種演算法「推薦」適合房客的房型。
可能類別如下：
1. 交通便利（離地鐵近）
2. 安全等級
3. 周圍生活機能（餐廳等）
:::

#### District Page （根據選定的城區）

背景：NYC此城區的詳細地圖https://hackmd.io/EUfzOidvSUOhOus6smSKrw#
顯示背景資訊：用戶於Main Page 輸入的資料、日期&時間
顯示主畫面資訊：旅店單位（以長方形之類包著）

若用戶對特定旅店感興趣，可點擊旅店名字進入旅店資訊頁

:::info
**旅店單位**
子項目包含：
1. 旅店名稱
2. 價錢
3. 房東名稱
4. 評分
5. 旅店位置
:::

#### Hotel Page

背景：待定（可能是Listing Detailed 裡面的Picture URL）
顯示背景資訊：旅店名稱、價錢
顯示主畫面資訊
* 網頁上半：詳細單位
* 網頁下半：評論區

:::info
**詳細單位**
子項目包含：
1. 旅店名稱
2. 旅店
3. 價錢
4. 房東名稱
5. 評分（應包括細項評分）
6. 旅店位置
7. 房東資訊（名字、自我介紹）
8. 屋型、房型
9. 內含設施、設備（如：有電視、路由器...）
:::

:::info
**評論區**
內容：
1. 顯示過往旅客評價
2. 有一留言欄位可供評論
:::

#### Review Page

有兩欄：

* 標題
* 內文
* 評分

有一個提交按鈕，按下去即可更新資料庫評論部分。

#### Edit Review Page

輸入評論ID驗證，再進行修改
輸入ID後，可將新的評論更新上去

#### *Additional Info Page (Extension)
擴充內容，可以包含：
* 紐約城資訊
    * 城市文化、歷史
    * 名勝古蹟
    * 城市位置
    * 推薦餐廳
    
* 交通資訊
    * 地鐵圖
    * 共享單車網頁
    * 租借汽車網頁


## Work Plan
### 第九周
* Create Table

### 9 - 12 週
* 實作SQL
* 建構網頁 & UI介面
* 連接UI & DB

### 12 - 15 週
* UI 優化 
* SQL 功能優化 & Debug
* 土地公廟拜拜
---


### To-Do List
### Data
- [x] The description of your data
- [x] Introduction to the data
- [x] Where is the data from
- [x] What do the columns and tables mean
- [x] Other information about your data (e.g. will it be updated in the future?)
- [x] The source of your data
- [x] Link to your data source
### Application Design
- [x] Main idea
- [x] The purpose of your application
- [x] Functionality
- [x] What kind of information will be presented to users
- [x] What kind of interaction will be available
- [x] What will be the scenario when a user use your application
- [x] What kind of data will users be able to interact with
- [x] Interface
- [x] Expected interface look (use figure or text to explain)
### Work Plan
- [x] Time schedule
:::info
No need for an exact date, just list all the tasks and sub-goals of your project, then tell us which part will be done first etc.
:::
- [ ] Discussion
:::info
We want to see how your team work together throughout this project, so please open a discussion board/channel (e.g. Hackmd note, Trello board) and record your discussion throughout the project. In the proposal, just open the discussion board/channel and provide the link
:::

- [ ] Repo
Link：https://github.com/DBMSTeam8/DBMS-Final-Project
:::info
Please open a github/gitlab repo for your project, your need to upload the source code of the project in the repo and a README to describe your functionality and the steps of reproducibility (at the end of the project
:::
- [x] Git (Optional) 
:::info
We encourage you to do version control and show contribution of each member using git, you will get extra points if you do this. In this proposal, just open the repo and provide the link.
:::






## Work Record
### 20241017
討論主題，找尋DataSet，並且從中篩選合適者。
* [FoodData Central](https://www.kaggle.com/datasets/willianoliveiragibin/fooddata-central?select=food_nutrient.csv)
* [London AirBNB](https://www.kaggle.com/datasets/jinxzed/londonairbnb?select=reviews+detailed.csv)
* [Attractions in China](https://www.kaggle.com/datasets/audreyhengruizhang/china-city-attraction-details)
* [BikeShare](https://www.kaggle.com/datasets/taweilo/capital-bikeshare-dataset-202005202408)
* [Overall French Demographics](https://www.kaggle.com/datasets/etiennelq/french-employment-by-town)
* [USA AirBNB](https://www.kaggle.com/datasets/konradb/inside-airbnb-usa)
* [NYPD arrests and crime dataset](https://www.kaggle.com/datasets/kamaravichow/nypd-arrests-and-crime-dataset)

:::success
最終決定：
AirBNB New York City Dataset

原因：
1. 實用性高
2. 資料量充足
3. 欄位分類豐富
4. 擴充性高
:::

:::info
擴充包
安全指標：犯罪率
交通資訊：地鐵
美食資訊：餐廳
遊樂資訊：景點
:::

--- 

### 20241023
1. 完成table的建置
2. write the proposal
3. 討論UI介面：
* option 1: add/delete/modify在同一介面
* option 2: 類似購物車畫面
結論:==尚未確定== 暫時先以option1，但之後時間如果發現可以美化，以option2為主
---
### 20241107
1. mysql: identify required functions
2. check tables
    * 修正清單 --> 有用到varchar 的東西上限好像都要再往上開
    * name -> 255, amenities varchar 2300
        * calendar
            * ~~price, and adjusted price all 0~~ fixed
            * done 24/11/07 23:27
        * listings_location (from listing)
            name --> 255
            * done
        * listings_detail
            amenities  --> 2300
            * done
        * host detail
            * host_about --> 7300
            * done
        * review_detail
            * comment --> 2000
            * done
        * listings_review_scores
---
### 20241111
:::warning
1. 在create table時匯入的檔案記得用原始檔
2. /var/lib/mysql-files/ 這個是我的csv檔路徑，不一定每個人都一樣，記得修改
:::
1. calendar create table 的code需要修改資料型態，date_ column不能用datetime存，要用date存(ref:https://ithelp.ithome.com.tw/m/articles/10239278)
//更，還是錯的...可能要用string(varchar或char)
//再更，用date，下面是修改後的calendar create table和執行結果:
code:
```sql
CREATE TABLE calendar (
    listing_id varchar(30),
    date_ date,
    available varchar(1),
    price float,
    adjusted_price float,
    minimum_nights int,
    maximum_nights int,
    PRIMARY KEY (listing_id, date_)
);
LOAD DATA LOCAL INFILE '/var/lib/mysql-files/calendar.csv'  
INTO TABLE calendar
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES 
(listing_id, date_, available, @price, @adjusted_price, minimum_nights, maximum_nights)
SET
    date_ = date_,
    available = available,
    price = REPLACE(REPLACE(@price, '$', ''), ',', '') + 0,  
    adjusted_price = REPLACE(REPLACE(@adjusted_price, '$', ''), ',', '') + 0,
    minimum_nights = minimum_nights, 
    maximum_nights = maximum_nights;   
```
result:
i. 修date_ column
![image](https://hackmd.io/_uploads/SJXx3DAWye.png)
ii. overall: 有些置左有些置右但不影響功能
![image](https://hackmd.io/_uploads/HJcLyuC-1e.png)

2. listings_location 這個table沒什麼大問題
result:
![image](https://hackmd.io/_uploads/HJigN_AW1x.png)

3. listings_detail 這個table也沒什麼問題
result:
![image](https://hackmd.io/_uploads/BkmGsGkzJl.png)

4. review_detail
    i. 原本date_這個column是存成datetime，但csv檔內的資料儲存格式是date，所以改成用date存(這個table只有這個問題)
    modified create table code:
    ```sql 
    CREATE TABLE review_detail (
    listing_id varchar(30),
    id varchar(30),
    date_ date,
    reviewer_id varchar(30),
    reviewer_name varchar(255),
    comments varchar(2500),
    PRIMARY KEY(listing_id, id)
    );
    LOAD DATA LOCAL INFILE './reviews_detailed.csv'
    INTO TABLE review_detail
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES
    (listing_id, id, date_, reviewer_id, reviewer_name, comments);
    UPDATE review_detail
    SET comments = REPLACE(REPLACE(comments, '</br>', ''), '<br/>', '');
    ```
result: 
![image](https://hackmd.io/_uploads/SkfGbQkfJx.png)

5. host_detail
    i. 原本host_id 抓錯資料變成下面這東西(除了這個問題其他都沒問題)
    
    ![image](https://hackmd.io/_uploads/rycO47JG1e.png)
    
    解法:
    code:
    ```sql
    CREATE TABLE host_detail (
    host_id varchar(50),
    host_name varchar(50),
    host_about varchar(7500),
    host_response_time varchar(50),
    host_response_rate float,
    host_is_superhost varchar(1),
    host_identity_verified varchar(1),
    PRIMARY KEY (host_id)
    );
    LOAD DATA LOCAL INFILE '/var/lib/mysql-files/listings_detailed.csv'
    INTO TABLE host_detail
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES
    (@dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, host_id, @dummy, host_name, @dummy, @dummy, host_about, host_response_time, host_response_rate, @dummy, host_is_superhost, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, host_identity_verified, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy);

    ```
    result:
    ![image](https://hackmd.io/_uploads/rkZjK7yfkg.png)

6. listings_review_score (非常有問題上面原本的sql只抓兩個column)
    解法:
    code:
    ```sql
    CREATE TABLE listings_review_score (
    id varchar(30),
    number_of_reviews int,
    review_scores_rating float,
    review_scores_accuracy float,
    review_scores_cleanliness float,
    review_scores_checkin float,
    review_scores_communication float,
    review_scores_location float,
    review_scores_value float,
    PRIMARY KEY(id)
    );

    LOAD DATA LOCAL INFILE '/var/lib/mysql-files/listings_detailed.csv'
    INTO TABLE listings_review_score
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES
    (id, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, number_of_reviews, @dummy, @dummy, @dummy, @dummy, review_scores_rating, review_scores_accuracy, review_scores_cleanliness, review_scores_checkin, review_scores_communication, review_scores_location, review_scores_value, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy);
    ```
    result:
    ![image](https://hackmd.io/_uploads/SJom141GJl.png)
---
### 20241112
已更新:

>==記得重建review_detailed，因為為了統一table的名字: 將review_detailed 重新命名為 review_detail==
describe 所有table的截圖

有時間的人可以做的--TODO list:
* 更新overview (最上方的關聯圖) //finished👌

晚上10:30 女二討論

目標
1. function要做什麼
2. 基於function，UI怎麼設計

code -> https://hackmd.io/@KuroPhoenix/S1IShI5W1e
### Functions



1. Main Page

    - Search Accomodations (增加評論)
    - Edit Comments （刪除、修改、存取歷史評論）

2. Search Accomodations Page

    - Input:
        
        A. District
        B. Room Type
        C. Number of people
        D. Duration of stay
    
    - Output: Takes user into result page

3. Result Page

    - Function: Returns accomodations nearby

        A. Sorted in overall score
    
    - Displays:

        A. Hotel Info
        B. review detail
        C. create new review

### Implementation FAQ

1. ==Ensure uniqueness when editing comments==:

* 展現評論：為了讓使用者避免肆意修改他人言論，展現評論時將把名字遮住

* 新增言論：輸入名字、評論內容

* 修改、刪除評論：輸入名字，保證名字獨特性（名 + 姓），展現這個使用者過往的評論，再修改、刪除。

2. ==留言ID沒用==

* 發現ID 屬於 [100, 1000] 不存在 —— 可直接對其進行賦值
---
### 20241121
1. 建立server，成功執行main_page
2. 重新繪製Interface
---
### 20241126
* 確認UI 介面
---
### 20241203/20241226更新
    以下分點說明各個網頁需要具備的功能：
Application
1.	Login/sign up pages:
    1.	Interface of login page:
    當使用者進入login page時，在畫面正中顯示網站名稱(Your Best Guide to Find Hotels in New York City)與提示訊息(Sign in with your Account!)並提供兩個欄位供使用者分別輸入其帳號名稱及密碼，在此兩個輸入框的正下方提供Sign in按鈕供使用者點擊登入帳號，而在按鈕的正下方也提供尚未創立帳號的使用者前往sign-up page創設帳號的連結。

    2.	Interface of sign-up page:
    當使用者進入sign up page時，在畫面正中顯示文字(Create Your Account Now)並提供兩個欄位供使用者分別輸入帳號名稱及密碼，在此兩個輸入框的正下方提供Sign up按鈕供使用者點擊創立帳號，在按鈕的正下方也提供使用者直接回到login page的連結。
    
    3.	Functions of login page(CRUD):
    提供使用者輸入帳號及密碼登錄系統的功能，若是入成功將進入 home page。
    
    Read: 讀取使用者輸入的帳號及密碼，並在users table中檢查該使用者所輸入的帳號密碼是否存在且正確。
    
    A. Query design:
    在users table中select出符合條件(name_ = 使用者輸入帳號)的資料，由於我們在sign-up page會確保每位使用者所使用的帳號名稱不能重複，因此可以用name_欄位不具有重複的值，因此可以用來判斷該使用者是否曾創設過帳號，若是帳號存在則利用先前query出的資料檢查password是否與使用者輸入的password相符(此處password接使用SHA256加密)若相符則成功登入，此時將會將使用者的名稱及id存入session方便後續應用並進入到home page
。
    B. Exception handling: 
    在按下sign in按鈕時將先檢查使用者是否在帳號密碼兩個欄位皆有輸入，若是其中有一欄位未輸入則顯示訊息”ALL fields required”。
若是users table中不存在與使用者輸入帳號相符之資料則代表該使用者尚未創設帳號，因此顯示訊息”Username does not exist. Please sign up.”提醒使用者先前往sign up page創設帳號。
在檢查使用者輸入帳號密碼時，若輸入的密碼錯誤則顯示”Incorrect password. Please try again.”。
    
    4.	Functions of sign-up page(CRUD):
    提供使用者創設新帳號的功能，當帳號創設成功後將跳轉至login page並顯示訊息”Account created successfully!”，並要求使用者重新登入。
Create: 在users table新增新的使用者帳號、密碼及id。
Read: 讀取使用者輸入的帳號及密碼並在users table中檢查該帳號名稱是否有被使用過。
    
    A.	Query design:
    在讀取使用者輸入帳號及密碼後，先在users table中select出符合條件(name_ = 使用者輸入帳號)的所有資料，若符合條件資料存在則代表該帳號名稱已被他人使用，反之代表該使用者可以使用此帳號名稱，藉由此方法確保table中name_欄位的值皆是獨特的。在帳號名稱尚未被他人使用的情況下，先用SHA256將password加密並產生一個獨特的id，在加密完成後，將該使用者的帳號名稱、id及加密後的密碼insert 至users table中。
    B.	Exception handling:
    當使用者輸入帳號密碼並按下sign up 按鈕時，將會檢查使用者是否在兩個欄位皆有輸入值，若有任一欄位為空則跳出錯誤訊息(All fields are required.)提醒使用者帳號及密碼兩個欄位皆須輸入。如果使用者輸入的帳號名稱在先前已存在於users table中，則顯示錯誤訊息” Username already exists. Please choose another.”。若是在insert的過程中發生預期之外的錯誤則顯示”Failed to create account. Please try again.”。
2.	Home page:
    1.	Interface of home page:
    當使用者進入home page時，將會在網頁中間顯示些許歡迎訊息，並在左上角提供logout的按鈕讓使用者登出、右上角顯示當前使用者登入的帳號名稱。在網頁的中央部分分成左半與右半兩個區塊，左半塊顯示文字”Find accommodation in NYC!“並提供一個按鈕供使用者前往搜尋網頁，而右半塊顯示文字”Manage Comment”並提供一個按鈕供使用者前往留言管理網頁。
    2.	Functions of home page(CRUD):
提供使用者登出的按鈕、前往搜尋住宿網頁的按鈕、前往管理先前留言網頁的按鈕，此網頁主要是讓使用者選擇接下來要使用何種功能，因此沒有對資料庫進行CRUD。
3.	edit review page
    1.	Interface of edit review page:
    當進入edit review page時會置中顯示標題”Manage Your Reviews”，並在右上角提供回到home page的按鈕(Back to Home)供使用者返回home page。在網頁標題的正下方將以表格形式顯示該使用者過去曾經留過的所有評論與每則評論的相關資訊，包含留下評論時的日期(如:2024-12-19)、對哪間Airbnb留評論、評論內容，此外，對於表格中的每則留言皆有提供兩個按鈕，分別為delete及modify，當使用者想刪除特定留言時，直接點擊delete按鈕即可將該留言從資料庫中刪除，當刪除資料成功時將更新該使用者過去曾留過的評論並顯示”Review deleted successfully!”，而當使用者想修改留言時，點擊modify按鈕將會將該則評論的id存入session並進入modify review page供使用者修改該則留言。
    2.	Functions of edit review page(CRUD):
    提供使用者對過去曾經留下的所有留言進行修改與刪除的功能，並提供網頁右上角的Back to Home按鈕讓使用者回到home page。
    Read: 使用當前使用者的帳號名稱及使用者的id在review_detail 這個table中找出該使用者過去所有的留言，並找出該評論所對應到的Airbnb 名稱。
    Update: 當使用者刪除過去的留言時，更新listings_review_score table內的number_of_review欄位的數值。
    Delete: 在review_detail table中針對該使用者所選取的留言進行刪除。
    A.	Query design:
    在使用者進入此網頁的同時，使用當前使用者的帳號名稱及使用者的id在review_detail 這個table中select出符合條件(reviewer_id = 使用者id AND reviewer_name = 使用者名稱)的所有資料，在query的過程中將review_detail和listings_detail兩個table針對listing_id進行join，目的是將每則評論對應到的Airbnb名稱與id找出，方便後續的操作。
在進行query時，也將資料先針對該評論最後做更動的時間進行排序(由日期降序排序)，目的是讓使用者能快速的察看自己最近留下或修改的評論。
針對delete的操作，因為有先將該使用者過去的所有評論找出並以表格呈現，當使用者按下delete按鈕時可以立即得知要刪除的評論的id及其所對應的Airbnb id，由於每則評論的id皆是獨特的，此處直接將review_detail table中符合條件(review_id = id)的資料刪除。
由於將一則評論刪除後該Airbnb的評論總數會減一，此時利用先前找出該則被刪除評論對應到的Airbnb id在listings_review_score table中找到符合條件(listing_id = Airbnb id)的資料，再對該筆資料中的number_of_reviews項目的值進行更新。(在listings_review_score table中，listing_id都是獨特的)
    B. Exception handling:
    當使用者在先前沒有留過任何評論的情況下進入此頁面，將顯示文字”No previous reviews found.”。
若是在delete的過程中發生預期外的錯誤將顯示訊息”Failed to delete review:(該使用者欲刪除的留言)“。
4.	modify review page
    1.	Interface of modify review page:
    在進入此頁面時將顯示標題”Modify Your Review “，在標題的下方會提供一個輸入方框，方框內將顯示該使用者欲修改的評論原始內容，使用者可以直接在輸入方框內對評論進行修改，在修改完評論後直接按下方框下的modify按鈕即可更新該則評論。此外，在此網頁的右上角提供兩個按鈕，一個功能為回到home page(Back to Home)，另一為回到edit review page(Back to Reviews)，讓使用者可以快速地回到首頁或是前往編輯其他留言。當評論修改成功後將回到edit review page並顯示文字”Review epdated successfully!”，而剛才成功修改的評論將顯示在表格的最上方(因為在edit review page每則review的排序規則是照編輯的日期進行降序排序)。
    2.	Functions of modify review page(CRUD):
    此網頁主要提供使用者修改過去的特定留言，。
    Update: 讀入使用者在方框中修改後的評論並在review_detail table中更新當前使用者過去曾經留下的特定評論。
    
    A.	Query design:
先從session中取出欲修改的評論的id接著在review_detail table中找出符合條件(id = 欲修改的評論的id AND reviewer_id = 使用者id)的唯一資料並顯示。當使用者修改完評論時，更新review_detail table中符合條件(id = 欲修改的評論的id)的資料之comments欄位、date_欄位，分別將此兩個欄位的值更新為修改後的評論及修改的日期。由於在review_detail table中每個的評論的id皆是獨特的，因此在修改時以id作為篩選條件能確保資料正常更新。

    B.	Exception handling:
在update的過程中如果發生預期之外的錯誤將顯示”Failed to update the review: (欲修改的評論)”。
5.	search hotel page
    1.	Interface of search hotel page:
    當進入此頁面時先顯示文字”Find the Airbnb that meets your requirements in New York City “和“Please fill in the following blacks of your requirements “
在文字下方提供五個下拉式選單供使用者選擇需求:
第一個欄位： 	location
第二個欄位： 	number of people(數值範圍: 1~100)
第三個欄位： 	number of days stay(數值範圍: 1~365)
第四個欄位： 	expected room type
第五個欄位：	expected property type
以上五個下拉式選單中的資料皆是從listings_detail table中query出的所有獨特值，確保每個選項皆存在於table中。在此五個欄位下方設置一個search 按鈕，當使用者按下按鈕後將把所選取的條件存入session，並依選取條件進行搜尋、進入hotel page顯示所有符合條件的Airbnb。此外，在網頁右上角提供回到home page的按鈕(Back to Home)。
    2.	Functions of search hotel page(CRUD):
    此網頁主要功能為讓使用者選取要篩選的條件，並將條件存入session中方便後續操作，因此沒有對資料庫進行CRUD。
    A.	Exception handling:
    在此頁面要求使用者每個欄位皆要選取，因此在使用者按下search按鈕時會檢查是否有欄位沒有選取，若有任一欄位未被選取將顯示錯誤訊息。
6.	hotel page
    1.	Interface of hotel page:
    在此頁面將顯示網頁標題”Airbnbs That Meet Your Requirements”，在標題的左下方提供資料排序方式的下拉式選單，此處提供六種排序方式，分別為由rating高至低排序(預設)、由rating低至高排序、由price高至低排序、由price低至高排序、由cp值(rating/price)由低至高排序、由cp值(rating/price)由高至低排序。下方將以表格的方式顯示所有符合條件、排序後的資料，表格中包含四個欄位，第一個欄位為Airbnb的名稱，第二個欄位為該Airbnb的rating(滿分五分)，第三欄位為該Airbnb的價格(美金)，第四欄位為check details按鈕，當使用者按下check details按鈕後將進入details page並獲得該Airbnb的詳細資訊。
由於符合條件的資料筆數可能非常龐大，因此限制一個分頁最多顯示30筆資料，故在表格下方有選擇要前往第幾個分頁的按鈕供使用者快速前往該分頁。此外，在每個分頁的最下方有提供new search按鈕，當使用者想要重新輸入條件進行搜尋時可以直接按下此按鈕回到search hotel page重新進行搜尋，網頁的右上角亦有提供回到home page的按鈕(Back to Home)。
    2.	Functions of hotel page(CRUD):
    此頁面主要的功能為運用在search hotel page存入session的使用者需求搜尋所有符合條件的Airbnb並提供排序的功能。
    Read: 利用使用者選取的條件(location、num_people、num_days、room_type、property_type)進行搜尋。
    
    A.	Query design
    由於Airbnb的地區資料、Airbnb的居住時間限制及Airbnb的房型、人數限制等資料分散在三個不同的table，分別為:calendar table、listings_location table、listings_detail table，因此在找出所有符合條件的Airbnb時，先從各個table篩選出符合特定條件的Airbnb id，亦即，在calendar table中篩選出所有符合條件(minimum_nights <= num_days AND num_days <= maximum_nights)的Airbnb id、在listings_location table中篩選出所有符合條件(neighbourhood_group = location)的Airbnb id、在listings_detail table中篩選出所有符合條件(property_type = property_type AND room_type = room_type AND accommodates >= num_people)的所有Airbnb id，由於在calendar table中相同Airbnb會有出現多次的情況，因此在query時使用DISTINCT語法確保每個取出的Airbnb id都是獨特的，接著將得到的三個由Airbnb id組成的集合取交集得到所有符合所有條件的Airbnb id。
在得到所有符合使用者選取條件的Airbnb id後，我們需要在進行一次query找出所有符合條件的Airbnb的名稱、rating、price，而此三項資料分散在三個不同的table，分別為:listings_detail、listings_review_score、calendar，因此需要將這個query分成多的步驟處理，首先，由於calendar中每個Airbnb在不同日期皆會有不同的資料，因此我們先篩選出每個Airbnb最新(日期最大)的一筆資料，並將資料中的listing_id及price取出站存為c，接著由listing_id join listings_detail、listings_review_score、c 三個table，並找出符合條件(listing_id = 所有符合使用者選取條件的Airbnb id)的所有資料，再從資料中取出Airbnb的id、名稱、rating、price資料，由上述步驟可以確保每個Airbnb的最新資訊能被正確選出，並且同一個Airbnb只會有一筆最新資訊被選出，不會有多筆相同Airbnb在不同日期的資訊被選出的情況。
在將所需顯示的所有資料選出後將再依據使用者選取的排序方式進行排序，並依據總資料量進行分頁，每頁30筆資料。
    
    B.	Exception handling:
    當沒有任何Airbnb符合使用者所選取的所有條件時，顯示”No Airbnb Found”、”No Airbnb meets your requirements.”等訊息，並在文字下方提供Return to search page的按鈕供使用者點擊回到search page重新選取條件。
7.	Detail page
    1.	Interface of details page:
    在頁面上方顯示目前查看的是哪個AirBnB，隨後顯示此AirBnB的”Listing Location, Listing Detail, Listing Reviews, Listing Host”等相關資訊，由於listing detail中的amenities項目可能會有龐大的資料量，因此網頁會先顯示五筆資料，若是使用者想要查看更多資料則可點擊”click for more details”按鈕查看更多資料，相同的，在listing reviews中的comments項目可能會有大量的評論筆數，因此網頁會顯示前五筆評論，若使用者欲察看所有評論則可點擊”click for more details”按鈕查看所有評論。此外在頁面最下方設置兩個按鈕”Add Review”以及”Back to search results”，分別提供新增評論、回到查詢結果頁面的功能。
    2.	Functions of hotel page(CRUD):
    此網頁主要提供使用者查看其在hotel page所選取之Airbnb的各種詳細資訊。
    
    A.	Query design:
利用先前在Hotel page query出來的Airbnb id在資料庫中分別找出該Airbnb的location資訊(Neighborhood group、Neighborhood)、detail資訊(property type、room type、accommodates、bedrooms、beds、amenities)、reviews資訊(number of reviews、ratings、accuracy、cleanliness、check-in、communication、location、comments)、host資訊(host name、about host、response rate、identity verified、superhost)。由於上述資訊分散於listings_location table、listings_detail table、review_detail table、listings_review_score table、host_detail table，因此在找出此網頁要的所有資料時，分別對五個table進行query並取出資料。
除了host_detail table，其餘四個table中皆有listing_id(id)的欄位，且listing_id(id)皆為primary key，因此可以直接使用該Airbnb的id進行query並找出欲查詢之資料。為了能順利找出host的詳細資訊，我們先對listings_location這個table query出該Airbnb的host之id，再依據此host id在host_detail table中query該host的詳細資訊，由於host_detail table中host_detail為primary key，因此直接使用host id進行query。此外，在對review_detail table進行query找出該Airbnb所有評論時，會對每則評論的日期進行降序排序，確保最新的評論會被列在最上方。
    
    B.	Exception handling:
當使用者欲察看的Airbnb在某些項目中是沒有任何值存在的情況下，網頁將在該項目保持空白以表示該項目查無資料，例如:若先前沒有任何使用者對某一特定的Airbnb留下評論，則網頁中的comments項目將會是空白的。

8. add comment page
    1.	Interface of details page:
    在使用者進入此網頁時顯示網頁標題”Enter the comment about: (使用者所選取之Airbnb)”，並在文字下方提供一個輸入方框供使用者輸入其欲新增之評論，當使用者輸入完欲新增之評論後按下輸入方框下方的add review按鈕即可新增評論。此外，在網頁右上角提供回到首頁(Back to Home)按鈕。
    2.	Functions of hotel page(CRUD):
此網頁之功能主要為提供使用者對特定Airbnb新增評論。
Create: 將使用者輸入的評論插入review_detail table，插入的資料包含亂數生成給該review的id、該評論對應到的Airbnb id、留下評論的日期、使用者的id、使用者名稱、評論。
    Update: 由於該特定Airbnb的評論總數增加，因此需要修改listings_review_score table中該Airbnb id對應到的number_of_reviews欄位。
    
    A.	Query design:
使用先前使用者所選取的Airbnb id在listings_detail table查詢該Airbnb的名稱並顯示。在使用者按下Add review按鈕時將對應的資料插入review_detail table中並更新儲存在listings_review_score table中該airbnb的number of review數值。

    B.	Exception handling:
當在進行插入資料的過程中發生無法預期的錯誤時，顯示訊息"Fail to add review: (使用者所輸入的評論)”，而當使用者沒有在輸入方框輸入任何值卻按下add review按鈕時將顯示訊息提醒使用者必須輸入評論才能新增評論。

## git使用教學
==如果有太過簡陋的地方可以去看HW0==
#### Step1: fork 建立1次就好了
![image](https://hackmd.io/_uploads/BJanqDXQ1l.png)

```
git clone {your_forked_SSH_key}
```
==**以下操作在git下來的資料夾** 不用建自己會生==
#### Step2: 取得目前最新版本
* 首先到自己github的repositories找此專案的fork，並確認是否為同步
    ![image](https://hackmd.io/_uploads/ByTUxsOB1l.png)
若沒有同步會像上面這樣，需要update，然後更新好後會像這樣
    ![image](https://hackmd.io/_uploads/ryF5eouHyx.png)
就可以回到終端機上執行下面指令。
```bash
git pull
```

#### Step3: Push
```
git status // 確認有哪些更動的檔案
```


if it works
![image](https://hackmd.io/_uploads/HJS33PQ7ke.png)
![image](https://hackmd.io/_uploads/rJM5AwmXJx.png)

```
git add {file_to_push}
git commit -m "the comment you want to tell chia chen thank //be ware that it may show publicly"
git push --set-upstream origin main
```
![image](https://hackmd.io/_uploads/ryPbAvmXyg.png)
    
then go to your fork and click here
![image](https://hackmd.io/_uploads/H1gfluXm1g.png)

![image](https://hackmd.io/_uploads/S16BxOXQ1g.png)
    
