iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0

今日目標,記錄使用者的狀態。

先描述使用者的畫面和可操作功能

  • 使用者在房間列表的頁面
    • 可以看到各個房間
    • 點選「加入」後進到該房間的頁面
  • 使用者在房間的頁面
    • 可以看到其他使用者
    • 點選「返回」後回到房間列表的頁面
    • 點選「準備」後顯示為準備,再點一次就取消準備

這時候請讀者根據上方的情景試想一些狀況:

  • 使用者已經在房間,卻又輸入房間列表的網址進到房間列表頁面
  • 使用者明明不在房間,卻根據房號輸入對應網址進到房間頁面

如果紀錄每個使用者的狀態,就可以在使用者在發生上述的情況時,做出對應的處理(比如禁止他到那個頁面),我們要記錄的狀態資訊包含:

  • 是否在房間
  • 如果已經在房間內,他那個房間的房號是多少
  • 如果已經在房間內,那是否已經準備

因此,我們要再建立一個實例幫忙儲存這些資訊:

  1. 在 room package 建立一個 java class,名稱為 UserStatus
  2. 在這個實例,我們需要兩個類別,一個是 Status 單純的紀錄狀態,另一個是 UserStatus 記錄使用者對應狀態
    • Status 的資訊:是否在房間(inRoom)、房號(roomId)、是否準備(ready),並且擁有對應的 Getter 和 Setter
    • UserStatus 藉由維護一張 HashMap 來實現,其中 key 是 username,value 是 Status,並且擁有對應的方法修改各使用者的狀態
  3. UserStatus 完整內容如下:
    package com.example.room;
    
    import lombok.Getter;
    import lombok.Setter;
    import org.springframework.stereotype.Component;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @Getter @Setter
    class Status {
        private boolean inRoom = false;
        private String roomId = "";
        private boolean ready = false;
    }
    
    @Component
    public class UserStatus {
        Map<String, Status> userStatus = new HashMap<>();
    
        public void setUserInRoom(String username, boolean isInRoom) {
            this.userStatus.get(username).setInRoom(isInRoom);
        }
    
        public boolean isUserInRoom(String username) {
            return this.userStatus.get(username).isInRoom();
        }
    
        public void setUserRoomId(String username, String roomId) {
            this.userStatus.get(username).setRoomId(roomId);
        }
    
        public String getUserRoomId(String username) {
            return this.userStatus.get(username).getRoomId();
        }
    
        public void setUserReady(String username, boolean isReady) {
            this.userStatus.get(username).setReady(isReady);
        }
    
        public boolean isUserReady(String username) {
            return this.userStatus.get(username).isReady();
        }
    
        public boolean containsUser(String username) {
            return this.userStatus.containsKey(username);
        }
    
        public void initialize(String username) {
            this.userStatus.put(username, new Status());
        }
    }
    

其實應該在昨天寫的,但今天才想到 /images/emoticon/emoticon06.gif
(同樣的,小弟不確定是否需要一個 Service 負責存取這個實例)


上一篇
Day 16 - 定義房間
下一篇
Day 18 - 房間列表
系列文
Spring Boot... 深不可測31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言