---
# System prepended metadata

title: Week 5

---

# Week 5
## Scenarios
### Scenario 1：行程規劃
#### 使用者
- 宜臻，一位剛畢業的大學生，決定和朋友一起安排暑假的花蓮四日旅遊。
#### 流程
- 宜臻坐在書桌前，使用平板開啟「旅遊小幫手」App。
- 她點選主畫面的「AI 行程規劃」圖示。
- 系統切換至設定頁面，她輸入：
    - 出發地：「台北」
    - 目的地：「花蓮」
    - 天數：「4天」
    - 日期：「7月5日～7月8日」
    - 偏好：「自然風景」、「歷史建築」
- 點擊「開始規劃」，系統顯示提示「為您規劃中……」。
- 幾秒後，畫面顯示四日行程，包括每個景點卡片、圖片、推薦時間與交通安排。
- 在行程頁面上方，出現「導覽模式」選單，提供三個導覽選項按鈕：
  - 「語音導覽」：啟動自動播放全行程景點語音解說
  - 「VR 導覽」：開啟虛擬實境模式，預覽景點場景與導覽資訊
  - 「AR 導覽」：按鈕呈現灰階，標註「需到達現場方可使用」
- 她點選「語音導覽」：
  - 系統依照第一天景點順序開始播放語音介紹內容。
- 接著她點選「VR 導覽」：
  - 畫面切換至景點 360° 模式，可自由旋轉觀看建築與環境。
  - 可左右滑動切換各個景點的 VR 導覽。
- 她點選第一天的「松園別館」卡片，進入詳細資訊頁面，查看：
  - 景點介紹
  - 熱門評論摘要（由 AI 歸納）
  - 圖片與實用資訊（開放時間、交通方式等）
- 點選「← 返回」，她回到行程卡片瀏覽模式。
- 她發現「花蓮文化創意產業園區」排在第一天晚上過於普通，點選右上角垃圾桶圖示。
  - 系統彈出確認：「是否刪除此行程？將重新計算路線與時間」→ 她點選「確定」
  - 景點被移除，系統即時重排路線與交通時間。
- 她覺得「七星潭」更適合第一天下午：
  - 點選「編輯行程」→ 長按「七星潭」卡片 → 拖曳至第一天下午。
  - 放手後畫面更新順序與地圖路線。
- 她想到朋友推薦的「石梯坪」：
  - 點選「新增景點」→ 輸入「石梯坪」→ 點擊加入 → 選擇加入「第二天下午」。
  - 景點成功加入行程，系統更新路線與預估交通時間。
- 修改完成後，宜臻檢視行程頁面，確認內容無誤。
- 她點選畫面下方的「完成規劃」按鈕。
- 系統跳出視窗提示是否匯出行程 → 她點選「產生分享連結」，將連結傳送給好友小嵐，一起準備花蓮小旅行。
- 她點選畫面左上角的「← 返回」，回到主畫面。
  - 系統在「您的行程」顯示「花蓮四日遊」的行程標題卡片，方便她之後繼續編輯或導覽。

## 介面

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

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

![image](https://hackmd.io/_uploads/HJ-Y03Lyel.png)

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

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

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

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

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

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

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

## Use case models
Use Case： Planning and Landmark Navigation（行程規劃）

Participating Actors（參與角色）：

    1. 使用者（如旅遊規劃者、學生、觀光客）

    2. AI 規劃模組
    
    2. 導覽模組

Entry Condition（開始情況）：

    使用者已開啟 App，並選擇「AI 行程規劃」功能。

Flow of Events（事件流程）：

    1. 使用者啟動 App，點選「AI 行程規劃」。

    2. 使用者可以輸入出發地、目的地、日期、天數與偏好類型。

    3. 使用者確認資料後，點選「開始規劃」。

    4. 系統生成行程卡片，包含景點、交通建議與時間安排。

    5. 使用者可以檢視、編輯或新增景點。
    
    6. 使用者可以在行程中選擇「地標導覽」模式。
    
    7. 使用者可以在「地標導覽」模式選擇「語音導覽」、「VR 導覽」「AR 導覽」
    
    8. 系統根據使用者選擇的導覽方式開始進行導覽。
    
    9. 使用者完成行程編輯後，點選「完成規劃」，行程儲存，並返回主頁。

Exit Condition（結束情況）：

    行程成功儲存且可供存取或分享。
    地標導覽順利完成，返回行程頁或主畫面。

Exceptions（例外狀況）：

    1. 網路中斷，無法下載或更新行程／景點資訊。

    2. 相機或 AR 模組無法啟動（如未開啟相機權限）。

    3. GPS 定位失敗，導致無法正確導覽。

    4. 景點資料庫缺少地標或無法推薦。

Nonfunctional Requirements（非功能性需求）：

    1. 使用介面直覺與快速反應：介面須具備高直覺性，操作反應時間短。

    2. 高效能行程規劃：行程規劃作業須於 5 秒內完成。

    3. 多語系支援：支援中英文操作介面，語音導覽須支援在地語言與離線使用。

    4. 資訊計算準確性：行程與路線計算、景點資訊與交通時間需具備高準確度。

    5. AR 模組穩定性：需支援即時影像辨識與穩定浮動資訊顯示。

    6. 戶外環境適應性：UI/UX 設計應適應戶外強光，避免使用困難。

## Class identification from use case models


### 文字分析得到的類別圖和Data dictionary
| Example          | Part of speech | UML model component                         | 型態    | 說明                                             |
| ---------------- | -------------- | ------------------------------------------- | ------- | ------------------------------------------------ |
| 使用者           | 名詞           | class `User`                                | class   | 使用此 App 的人                                  |
| 行程             | 名詞           | class `Itinerary`                           | class   | 由多個景點及時間安排組成的旅遊計畫               |
| 景點             | 名詞           | class `Attraction`                          | class   | 行程中的單一觀光地點                             |
| 系統             | 名詞           | class `TravelAssistantSystem`               | class   | 負責行程規劃與導覽的核心模組                     |
| 語音導覽         | 名詞           | class `VoiceGuide`                          | class   | 播放行程語音講解的模組                           |
| VR 導覽          | 名詞           | class `VRGuide`                             | class   | 提供虛擬實境景點預覽的模組                       |
| AR 導覽          | 名詞           | class `ARGuide`                             | class   | 提供擴增實境現場導覽的模組                       |
| 行程卡片         | 名詞           | class `ItineraryCard`                       | class   | 顯示每日景點與時間的視覺化卡片                   |
| 掃描框           | 名詞           | class `ScanFrame`                           | class   | AR 導覽時提示對準地標的框架                      |
| 浮動資訊框       | 名詞           | class `FloatingInfoBox`                     | class   | 顯示地標資訊並播放語音的浮動視窗                 |
| 公開景點資訊     | 名詞           | class `PublicAttraction`                    | class   | 存放從官方來源獲取的景點詳細資料                 |
| 個人景點備註     | 名詞           | class `PrivateAttraction`                   | class   | 存放使用者個人對景點的筆記或標記                 |
| 出發地           | 形容詞         | `Itinerary.startLocation`                   | String  | 行程的起點城市或地點                             |
| 目的地           | 形容詞         | `Itinerary.destination`                     | String  | 行程的終點城市或地點                             |
| 天數             | 形容詞         | `Itinerary.days`                            | Date | 行程持續的天數                                   |
| 日期區間         | 形容詞         | `Itinerary.dateRange`                       | DateTime  | 行程的開始與結束日期                             |
| 行程標題         | 形容詞         | `Itinerary.title`                           | String  | 行程的名稱或標題                                 |
| 偏好             | 形容詞         | `User.preference`                           | String  | 使用者偏好的景點類型                             |
| 使用者編號       | 形容詞         | `User.userID`                               | String  | 使用者的唯一識別編號                             |
| 圖片             | 形容詞         | `ItineraryCard.image`                       | Blob  | 行程卡片中展示的景點圖片                         |
| 交通資訊         | 形容詞         | `ItineraryCard.transportationInfo`          | String  | 建議的交通方式與時間                             |
| 推薦時間         | 形容詞         | `ItineraryCard.displayTime`                 | DateTime  | 推薦造訪景點的時間                               |
| 景點評論摘要     | 形容詞         | `Attraction.reviewSummary`                  | String  | AI 歸納的使用者評論摘要                          |
| 實用資訊         | 形容詞         | `Attraction.practicalInfo`                  | String  | 景點的開放時間與交通指引                         |
| 行程細節         | 形容詞         | `Itinerary.details`                         | String  | 行程的完整描述或備註                             |
| 行程順序         | 形容詞         | `ItineraryCard.order`                       | Integer | 卡片在行程中的顯示順序                           |
| 景點順序         | 形容詞         | `Itinerary.attractionOrder`                 | Integer  | 景點在行程中的排序                               |
| 評論來源         | 形容詞         | `Attraction.reviewSource`                   | String  | 評論內容的來源平台                               |
| 使用者地點       | 形容詞         | `User.currentLocation`                      | String  | 使用者當前所在位置                               |
| 搜尋             | 動詞           | `TravelAssistantSystem.searchAttractions()` | Attraction    | 根據使用者偏好搜尋推薦景點                       |
| 確認行程         | 動詞           | `TravelAssistantSystem.confirmItinerary()`  | void    | 保存並確認最終行程                               |
| 匯出行程         | 動詞           | `TravelAssistantSystem.exportItinerary()`   | PDF    | 匯出行程文件                       |
| 播放語音         | 動詞           | `VoiceGuide.play()`                         | Blob    | 播放語音導覽內容                                 |
| 顯示資訊         | 動詞           | `Attraction.displayInfo()`                  | String    | 顯示景點詳細資訊                                 |
| 新增景點         | 動詞           | `Itinerary.addAttraction()`                 | void    | 在行程中新增指定景點                             |
| 刪除行程         | 動詞           | `Itinerary.removeAttraction()`              | void    | 從行程中移除指定景點                             |
| 拖曳排序         | 動詞           | `Itinerary.reorder()`                       | void    | 重新排列行程中景點順序                           |
| 啟用鏡頭導覽     | 動詞           | `ARGuide.activateCamera()`                  | void    | 啟動裝置相機進入 AR 模式                         |
| 偵測實體定位     | 動詞           | `ARGuide.detectLocation()`                  | String    | 透過 GPS 定位使用者位置並回傳                          |
| 播放 VR 導覽     | 動詞           | `VRGuide.play()`                            | Blob    | 進入並播放 360° 虛擬導覽                         |
| 切換景點         | 動詞           | `VRGuide.switchScene()`                     | void    | 在不同景點的 VR 模式間切換                       |
| 掃描建築         | 動詞           | `ARGuide.scanLandmark()`                    | String    | 辨識並掃描真實世界中的地標                       |
| 播放資訊卡片語音 | 動詞           | `FloatingInfoBox.playVoice()`               | Blob    | 透過浮動資訊框播放語音                           |
| 自動偵測定位     | 動詞           | `ARGuide.autoDetectLocation()`              | String    | 持續追蹤並更新使用者位置                         |
| 顯示浮動資訊     | 動詞           | `FloatingInfoBox.display()`                              | void    | 顯示地標相關文字與圖片                                        |
| 更新景點資訊       | 動詞           | `PublicAttraction.updateOfficialInfo()`                  | void    | 更新官方來源提供的景點資料                                    |
| 編輯景點註記       | 動詞           | `PrivateAttraction.editPersonalTag()`                    | void    | 編輯使用者對景點的個人標記                                    |
| 計算路徑          | 動詞           | `TravelAssistantSystem.calculateRoutes()`                    | String    |    根據景點來規劃路徑       |


<!-- ![image](https://hackmd.io/_uploads/BJXZgRIklx.png) -->ㄐㄐ


### 類別圖關聯性
 ![image](https://hackmd.io/_uploads/ByTbgC8klx.png) 
<!-- ![image](https://hackmd.io/_uploads/HJbHRZCkge.png) -->

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


<!-- 這是UML的程式碼

https://hackmd.io/DYC4KcXRSLapJJCFEDjsXQ

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

 -->

### Sequence diagrams
<!--![image](https://hackmd.io/_uploads/r1vzmvRylg.png)-->
<!-- ![](https://cdn.discordapp.com/attachments/811875437058719757/1366979773418438697/bLHFJnD15B_FfvWZ70XtanfGGyBDe7BYCkuEkibsXypE4l1KebYWXPf0YyWVB86wmKY94ccWbGz3PtRtn5VmbT5kIs7HM_VDUxy_RtxJ8LSGBhoqZOWX6CSlNChHI-Ov9k6pU5HO3kNmwp7X9ZAO8pYpyNDEfgazxBeM33lYsQmhQ1fHHrYYO-HlOLW83jWMSr0CF68p0eslHfr9zeZD89HAOLdSbRbYM2d8fRSubKAefGKFFEnMWH_Wi5wJymTgRxjv_lEglY2tZgFpdK6rVg2sTWVbN44UDAxgYrVrF9JLwj9b9X-LSl9BJaDVPfPH5o9Gt6u9g5nAkF4wjk3szQFRUm4aReD9MIZ9N-jgnGzB5RLH1IceutmWWLDtgzgyB1sXkzdQ7c1aoYPE-pkMc3n4J3DMzAz31h4DpoQ2ZZ5FqDOwujCaK-5fDJZz98_oQk73dKpNwOFcQSlrY6szePsUhZFIR5m4QtwOcLUhoyt6LbZE1tvEBfSJyw9A..png?ex=6812ea9f&is=6811991f&hm=0bf1fb984af3d5392770f12895a834eba4c6f2dd2791b23bc2aad10a2d864945&) -->
![image](https://hackmd.io/_uploads/S15FmlZxxl.png)

<!--https://hackmd.io/@9XTl2igKQWK7JQmLq_2DNw/B1BTC80yel-->

### Activity Diagrams

<!-- ![image](https://hackmd.io/_uploads/r1jOISRkxl.png)

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

![image](https://hackmd.io/_uploads/r1knyLCJgl.png)
 -->

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


<!-- ![image](https://hackmd.io/_uploads/ry9OizAJxx.png) -->

<!--  
![image](https://hackmd.io/_uploads/BJQI9fAJgl.png)


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

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

 -->
<!-- ![image](https://hackmd.io/_uploads/HJOQsMAygx.png) -->
