---
# System prepended metadata

title: 其他功能 會議紀錄 & 規格書提案
tags: [會議記錄]

---

依重要程度排序（分工）
===
:::danger
核心功能
:::
- 忘記密碼

- 用戶登入~~(+載入玩家服裝、技能、xp、變數要宣告哪些~~ 
    - token

- ~~抽卡（包含伺服器驗證~~

- 用戶註冊



:::warning
重要功能
:::

- 換裝系統

- 用戶設定儲存（修改設定時觸發

- 玩家統計數據(場數、勝率等等

- 背包賣出系統

- 升級系統

- 成就系統


:::info
加分功能
:::

- 錯誤回報（傳訊息給開發者

- 檢查更新（沒更新不給玩

- 通知功能（更新內容等等

- 優惠代碼

_____________
討論結果
===
### 9/19
- PM：所有現有提出功能先盡量寫，大致寫出實作邏輯，不需要寫出程式
 交出去的規格書依詳細、重要程度再決定要不要報告

- 設計UI部分除了 input 和 output，要稍微幫忙，例如畫面安排、動畫顯示

- 寫出給伺服器的 input 和 output 就好

### 9/21
+ 9/20開會加入的要求：
    - 背包：賣出卡牌換金幣
    + 升級系統：相同卡牌可以合併升級
    + 成就系統：
        - 有功能的成就：E.g. 新手玩家 
        - 沒功能的成就：E.g. 革命家 

+ 決定資料庫儲存方式？
    + 還有哪些資料要加入資料庫中，資料庫的設計方式？
    + 用戶識別token怎麼發布、儲存

+ 9/21 上課老師的建議：
    + 是否要加入不同登入方式 (e.g., Google, Meta)
    + (行動應用資安聯盟--檢測項目)：功能要滿足要求

:::success
:mega: 開會結果

Before 2023/9/24 (Sun) : 
- 決定 Database 要存放的項目 (e.g., user_name)
- 決定 Database 項目的類型 (e.g., user_name -> type : string)
- 決定 Database 的設計架構
- (需要和外部討論確定) 用哪一種 Database 、 後端語言

Before 2023/9/26 (Tue) : 
- 美化自己原本負責的部份
    - 流程圖要包含 成功 / 失敗 的處理方式或輸出
- 加入 9/20 新增的重要功能：
    - 胡竣棋 => 升級系統
    - 林春輝、許鳳芹 => 成就系統
    - 小松崎祐司 => 背包賣出系統


:::
 
抽籤結果
===
胡竣棋
---
### 技能升級系統
想法：在資料庫中，用低等級的 skill 換高等級的 skill
(e.g., Skill_1_Lv1 numbers:3->1; Skill1_Lv2 numbers:0->1)

```mermaid
sequenceDiagram
    participant UI
    participant Upgrade System
    participant Server
    UI->>UI: 選擇想要升級的卡牌
    UI->>Upgrade System: 發出升級請求
    Upgrade System->>Upgrade System: 檢查內部變數是否符合條件
    note left of Upgrade System: 特定 Skills 數目不足，無法升級
    Upgrade System-->>UI: Fail: Not enough skills for upgrade
    note left of Upgrade System: 特定 Skills 不可以升級
    Upgrade System-->>UI: Fail: This skills can NOT upgrade
    note right of Upgrade System: 符合升級條件
    Upgrade System->>Server: 傳送要用戶升級的資訊
    Server->>Server: 檢查資料庫中玩家特定技能數量
    note left of Server: 特定技能數量不足
    Server-->>UI: Fail: NOT enough numbers of certain skills
    note right of Server: 特定技能數量正確
    Server->>Server: 將資料庫中舊技能的數目扣除 
    Server->>Server: 將資料庫中新技能的數目增加
    Server->>Upgrade System: 傳送用戶目前擁有的道具變數
    Upgrade System->>Upgrade System: 更新遊戲內道具變數
    Upgrade System->>UI: Success / new skill = skill_id
```

- 升級系統 - UI Input

    - skill_id：想要升級的技能id
    - HandleLoginResult：回調函數
    
- 升級系統 - UI Output
    - Status：動作結果 (Fail/Success)
    - new_skill： 新獲得skill的skill_id (If status = Success) 


- 升級系統 - Server Input
    - Token：用戶Token
    - Upgrade_Skill_ID：用戶想要升級的卡片ID

- 升級系統 - Server Output
    - Status：Success / Fail , Reasons
    - Skill_Data：更新過後的Player skill data
    
---
### 用戶登入
```mermaid
sequenceDiagram
    participant UI
    participant LoginManerger
    participant Server
    UI->>UI    : 輸入帳號、密碼
    UI->>LoginManerger    : 點擊登入按鈕
    LoginManerger->>LoginManerger    : 檢查連線狀況
    note left of LoginManerger: 沒有連線到網路
    LoginManerger-->>UI: Status:Poor Network
    note right of LoginManerger: 有連線到網路
    LoginManerger->>LoginManerger: 檢查帳號密碼輸入是否合法
    note left of LoginManerger: 帳號密碼不合法
    LoginManerger-->>UI: Status: Invalid Password or Account
    LoginManerger-->>UI: Status: Invalid Account
    note right of LoginManerger: 帳號密碼合法
    LoginManerger->>Server: 傳送帳號、密碼
    Server->>Server: 檢查帳號、密碼格式與內容
    note left of Server: 格式不合法
    Server-->>UI: Status: Invalid Input
    note right of Server: 格式合法
    Server->>Server: 帳號、密碼 hash 處理
    Server->>Server: 資料庫驗證帳號密碼
    note left of Server: 登入失敗
    Server-->>UI: Status: Wrong Password or Account
    note right of Server: 登入成功
 
    
    Server->>Server: 產生用戶識別 Token
    Server->>Server: 紀錄 Tokne 於 Database
    Server->>LoginManerger: Status: Success / Token = ...
    LoginManerger->>LoginManerger: 紀錄玩家取得的 Token
    LoginManerger-->>UI: Status: Success
```
- 用戶登入 - UI Input

    - account：用戶帳號
    - password：用戶密碼
    - HandleLoginResult：回調函數
    
- 用戶登入 - UI Output
    - Status：登入結果
    - Token：(登入成功) 用戶識別token


- 用戶登入 - Server Input
    - account：用戶帳號
    - password：用戶密碼

- 用戶登入 - Server Output
    - Status：登入結果
    - Token：(登入成功) 用戶識別token

---

### 換裝系統--換造型
```mermaid
sequenceDiagram
    participant UI
    participant EquipmentManerger
    participant Server
    UI->>UI: 選擇想要更換的造型
    UI->>EquipmentManerger: 按下更換造型按鈕
    EquipmentManerger->>EquipmentManerger: 檢查內部變數是否符合條件
    note left of EquipmentManerger: 使用者沒有此造型，無法裝備
    EquipmentManerger-->>UI: Fail: User do NOT have this Item.
    note right of EquipmentManerger: 使用者有此造型
    EquipmentManerger->>Server: 檢查使用者是否擁有造型
    Server->>Server: 資料庫數據比對
    note left of Server: 使用者沒有此造型，無法裝備
    Server-->>UI: Fail: User do NOT have this Item.
    note right of Server: 使用者有此造型
    Server->>Server: 資料庫儲存使用者目前使用的造型
    Server->>EquipmentManerger: Success: User do have this Item
    EquipmentManerger->>EquipmentManerger: 更改裝備造型變數
    EquipmentManerger->>UI: Success 


    
```


```EquipmentManerger.change_card_style``` --- 用來換造型

- **UI Input**
    - Style_Id：造型辨識碼
    - Result：回調函數

- **UI Output**
    - Status：是否成功更換造型 (Success / Fail)

- **Server Input**
    - Token：用戶識別token
    - Style_Id：造型辨識碼

- **Server Output**
    - Result：玩家是否成功更換造型

- **內部**
    - 修改”玩家目前使用造型“ 的變數

---

### 換裝系統--換技能
``EquipmentManerger.change_skills``--- 用來換攜帶技能

```mermaid
sequenceDiagram
    participant UI
    participant EquipmentManerger
    participant Server
    UI->>UI: 選擇想要更換的技能
    UI->>EquipmentManerger: 按下更換技能按鈕
    EquipmentManerger->>EquipmentManerger: 檢查內部變數是否符合條件
    note left of EquipmentManerger: 使用者沒有此技能，無法裝備
    EquipmentManerger-->>UI: Fail: User do NOT have this Item.
    note right of EquipmentManerger: 使用者有此技能
    EquipmentManerger->>Server: 檢查使用者是否擁有技能
    Server->>Server: 資料庫數據比對
    note left of Server: 使用者沒有此技能，無法裝備
    Server-->>UI: Fail: User do NOT have this Item.
    note right of Server: 使用者有此技能
    Server->>Server: 資料庫儲存使用者目前使用的技能
    Server->>EquipmentManerger: Success: User do have this Item
    EquipmentManerger->>EquipmentManerger: 更改裝備技能變數
    EquipmentManerger->>UI: Success 


    
```


```EquipmentManerger.change_card_style``` --- 用來換技能

- **UI Input**
    - Style_Id：技能辨識碼
    - Result：回調函數

- **UI Output**
    - Status：是否成功更換技能 (Success / Fail)

- **Server Input**
    - Token：用戶識別token
    - Style_Id：技能辨識碼

- **Server Output**
    - Result：玩家是否成功更換技能

- **內部**
    - 修改”玩家目前使用技能“ 的變數


---
林春輝
--

- 忘記密碼
```mermaid
sequenceDiagram
    participant 前端
    participant APP
    participant Server
    前端->>前端: 輸入username和email
    前端->>APP: 按忘記密碼按鈕，送出username和email
    APP->>APP: 檢查username和email輸入是否合法
    alt 輸入不合法
        APP-->>前端: 輸入不合法，改密碼失敗！
    else 輸入合法
        APP->>Server: 輸入合法，送出username和email
        Server->>Server: 搜尋username
        alt 找不到username
            Server-->>前端: 忘記密碼失敗
        else 找得到username
            Server->>Server: 檢查user輸入的email與資料庫裏記錄的userEmail是否相等
            alt 不相等
                Server-->>Server: 改密碼失敗
            else 相等  
                Server->>Server: 發驗證碼到user的email
                alt 驗證失敗
                    APP-->>前端: 驗證失敗，忘記密碼失敗
                else 驗證成功
                    APP->>前端: 驗證成功
                    前端->>前端: 輸入新的密碼
                    前端->>前端: 輸入確認新密碼
                    前端->>APP: 送出新密碼和確認新密碼
                    APP->>APP: 檢查新密碼是否跟確認新密碼相等
                    alt 新密碼和確認密碼不相等
                        APP-->>前端: 新密碼!=確認新密碼，改密碼失敗
                    else 新密碼和確認密碼相等
                        APP->>APP: 檢查密碼輸入是否合法
                        alt 新密碼輸入不合法
                            APP-->>前端: 密碼不合法，改密碼失敗
                        else 新密碼輸入合法
                            APP->>Server: 送出新密碼
                            Server->>Server: 新密碼hash處理，存新密碼
                            Server->>前端: 改密碼成功
                        end
                    end
                end
            end
        end
    end
```
**前端使用方法：**
Input: username, 新密碼，確認新密碼
Output: 是否成功改密碼
**Server需要的功能:**
Input: username, 新密碼
Output: username是否存在，email, 是否成功改密碼



- 玩家統計數據

玩家升級系統
```mermaid
sequenceDiagram
    participant 前端
    participant APP
    participant Server
    APP->>APP: 檢查token是否還有效
    alt token已過期
        APP-->>前端: 請從新登入
    else token還有效
        APP->>Server: 送出user's token
        Server->>APP: 送出user目前的等級，exp,total match played, total match won
        APP->>APP: total match played++
        opt 勝者
            APP->>APP: total match won++
            APP->>Server: 送出新的total match won
            Server->>Server: 更新total match won記錄
            Server->>Server: user金幣增加
        end
        APP->>APP: exp+=游戲結束後所得的exp
        APP->>APP: 判斷user有沒有升級
        opt 有升級
            APP->>前端: 送出升級的通知
            APP->>Server: 送出新的等級
            Server->>Server: 更新等級記錄
        end
        APP->>Server: 送出新的exp，total match played
        Server->>Server: 更新exp, total match played記錄
    end
```
**前端使用方法：**
（若有升級）Output: 升級通知
**Server需要的功能:**
Input: user's token
Output: user的等級, exp, total match played, total match won
更新數據

顯示玩家統計數據
```mermaid
sequenceDiagram
    participant 前端
    participant APP
    participant Server
    APP->>APP: 檢查token是否還有效
    alt token已過期
        APP-->>前端: 請從新登入
    else token還有效
        APP->>Server: 送出user's token
        Server->>Server: 搜尋token
        Server->>APP: 送出等級，排名，total match played, total match won
        APP->>APP: 計算勝率
        APP->>前端: 送出等級，排名，total match played, total match won, 勝率
    end
    
```
**前端使用方法：**
Output: user的數據
**Server需要的功能:**
Input: user's token
Output: user是否存在，user的數據


---
許鳳芹
--
用戶註冊
```mermaid
sequenceDiagram

    participant front end
    participant signUp manager
    participant Server
    front end->>front end: enter username,pass,email
    front end->>signUp manager: signUp button clicked

    signUp manager->>Server: send username,email,password
    
    Server->>Server: check account eligibity
    Note right of Server: go through database<br/>to check duplicates
    Note over Server: check username & email
    
    opt if not eligible
        Server-->>front end: send sign Up failed notification
        Note over signUp manager,Server: case 1: Username is already used<br/>case 2: email is already registered<br/>case 3: password too short
    end

    Server->>Server: generate & send verification code to user email
    Note over front end: user receive verification<br/>code from email
   
    front end->>front end: enter verification code
    front end->>signUp manager: confirm verification code
    signUp manager->>Server: send verification code
    Server->>Server: check verification code
    
    alt if verCode wrong
        Server-->>front end: code doesnt match notification
    else if verCode right
        Server->>Server: username & password hashing
        Server->>Server: add account to the database
        Server->>Server: generate user identification token
    end

    Server->>signUp manager: (sign up succesfull) notification
    Server->>signUp manager: send user identification token
    signUp manager->>signUp manager: record player token
    signUp manager-->>front end: return sign Up result
    
```

**front end**
Input :
- user email
- username
- password
(user will receive a verification code through email)

Output : 
- registration status (username has been used, email is already registered, password too short)
- sign up status : success -> logged in (with token)

**Server** 
Input :
- user email
- username
- password
(server will sent a verification code to verify email)

Output :
- account verification code
- account identification token
- status : sign up successfull

### 成就系統
```mermaid
sequenceDiagram
    participant 前端
    participant APP
    participant Server
    APP->>APP: 檢查token是否還有效
    alt token已過期
        APP-->>前端: 請從新登入
    else token還有效
        APP->>Server: 送出user's token
        Server->>Server: 搜尋user's token
        Server->>APP: 送出user所得的成就名單
        APP->>APP: 成就分類
        note over APP: 1. 有功能:協助遊戲進行<br/>ex: 新手玩家 ( 配對機制友善 )<br/>2. 無功能:增加遊戲趣味姓<br/>ex: 革命家 ( 連續三場以平民打敗王 )<br/>3. 顯示於玩家資料
        APP->>前端: 送出結果
    end
```


---
小松崎祐司
--

### 抽卡

#### 流程
```mermaid
sequenceDiagram
    participant UI
    participant APP
    participant Server
    UI->>APP    : 按抽卡
    APP->>Server: 傳送帳號，等級，抽卡分類
    Server->>Server: 按照抽卡的分類進行抽卡(服裝，卡片，技能等)
    Server->>Server: 執行抽卡
    note right of Server: 若需檢查(是否抽到不可以重複擁有的事物)
    Server->>Server: 儲存抽到的事物和其數量
    Server->>APP: 傳送抽到的事物與數量
    APP->>UI    : 顯示抽到的事物
```

#### 輸入
- **APP** 按抽卡
- **Server** 帳號，等級，抽卡分類(AccountId, Class, LotteryType)

#### 輸出
- **Server** 抽到的事物，數量
- **APP** 抽到的事物，數量，特效?

### 用戶設定儲存

背景音樂、音量、背景主題等等用戶偏好設定的儲存

#### 更改名字(nickname)

#### 輸入
- **UI** 新的名字
- **APP** 帳號，新的名字

#### 輸出
- **Server** 通知儲存成功

```mermaid
sequenceDiagram
    participant UI
    participant APP
    participant Server
    UI->>UI    : 按更改名字
    UI->>UI    : 輸入新的名字
    note right of UI: 檢查不可以使用的字
    UI->>APP   : 檢證過的新的名字
    APP->>Server: 傳送帳號，新的名字
    Server->>Server: 儲存新的名字
    Server->>APP: 通知儲存成功
    Server-->>APP: 通知儲存失敗
    APP->>UI    : 顯示新的名字
    APP-->>UI    : 顯示錯誤訊息
```

#### 更改背景音樂(background music)
```mermaid
sequenceDiagram
    participant UI
    participant APP
    UI->>UI    : 按背景音樂
    UI->>APP   : 音量分類ID
    APP->>APP: 更改播放背景音樂ID
    APP->>UI    : 播放
```

#### 調整音量(system volume, Voice volume, etc)
```mermaid
sequenceDiagram
    participant UI
    participant APP
    UI->>UI    : 按調整音量
    UI->>APP   : 音量分類ID，數值
    APP->>APP: 更改音量變數的數值
    APP->>UI    : 播放
```

#### 更改背景主題(background theme)
```mermaid
sequenceDiagram
    participant UI
    participant APP
    UI->>UI    : 按背景主題
    UI->>APP   : 背景主題ID
    APP->>APP: 更改背景主題ID
    APP->>UI    : 換背景主題
```


#### 背包賣出系統(item trade)

該功能可將背包裡的物品兌換成虛擬金幣

```mermaid
sequenceDiagram
    participant UI
    participant APP
    participant Server
    UI->>UI    : 按背包賣出
    UI->>APP    : 選擇物品和數量
    APP->>APP: 計算每個物品的價值
    APP->>UI: 顯示總價值
    UI->>APP: 確定
    APP->>Server: 傳送帳號，物品，數量
    Server->>Server: 計算&兌換
    Server->>Server: 更改該帳號的物品數量和金幣資訊
    Server->>APP: 通知成功
    Server-->>APP: 通知失敗
    APP->>UI    : 顯示兌換的金幣
    APP-->>UI    : 顯示錯誤訊息
```




### DATABASE設計

ER diagram
變數型的部分因為還沒確定變數的大小，所以只有int型。
字串的部分也一樣，所以我先統一用varchar型。
還有關於intermediate table的primary key，我統一用一個primary key的id。沒有使用composite primary key的概念(比如說account_items table的account_id和item_id設定為PK，用這兩個attribute來特定某一個record)。

```mermaid
erDiagram
    account ||--o{ account_card_styles : ""
    account ||--o{ account_skills : ""
    account ||--o{ account_items : ""
    account ||--o{ account_achievement : ""
    account ||--o{ account_data: ""
    account_card_styles }o--|| card_style : ""
    account_skills }o--|| skill : ""
    account_items }o--|| item : ""
    account_achievement }o--|| achievement : ""
    account{
        int id PK "Player ID"
        varchar name
        varchar email
        varchar password
        varchar token_id "UniqueKey"
        int token_validity
        varchar game_title
        int class
        int coin
    }
    account_card_styles{
        int id PK
        int account_id FK
        int card_style_id FK
    }
    card_style{
        int id PK
        int name
    }
    account_skills{
        int id PK
        int account_id FK
        int skill_id FK
    }
    skill {
        int id PK
        varchar name
        varchar description
    }
    item {
        int id PK
        varchar name
        varchar description
    }
    account_items{
        int id PK
        int account_id FK
        int item_id FK
        int quantity
    }
    account_achievement{
        int id PK
        int account_id FK
        int achievement_id FK
    }
    achievement{
        int id PK
        varchar achievement_name
        varchar achievement_description
    }
    account_data{
        int account_id FK
        int level
        int experience
        varchar rank
        int total_match
        int total_win
    }
```


DB 討論區
===
目前先在下面列出希望加入資料庫的資料
再麻煩 @小松崎祐司 看看能不能幫我們加到 ER diagram 中！


#### 背包功能需要存放的資料
- account Table
    - 主鍵 (PK)：Player_ID (Int)
    - 其他玩家相關資訊...

- Items Table
    - 主鍵 (PK)：Item_ID (Int)
    - 道具名稱：Item_Name (String)
    - 道具描述：Item_Description (String)

- PlayerItems Table
    - 外鍵1 (FK)：Player ID (Int)
    - 外鍵2 (FK)：Item ID (Int)
    - 道具數量：Quantity (Int)

- Skills Table
    - 主鍵 (PK)：Skill_ID (Int)
    - 道具名稱：Skill_Name (String)
    - 道具描述：Skill_Description (String)

- PlayerSkills Table
    - 外鍵1 (FK)：Player ID (Int)
    - 外鍵2 (FK)：Skill ID (Int)
    - 道具數量：Quantity (Int) <- skill(技能)也有數量嗎?

