電子畫板開發需求
教師端需求:
-
教師登入後能建立房間(教室)
-
學生加入房間後有通知提醒
-
教師能夠解散房間
-
基本的畫板功能
學生端需求:
-
能夠切換不同線上的房間
-
能夠收到新建房間的通知
-
能夠收到房間解散的通知
-
基本的畫板同步功能
本文原文地址:https://www.limitcode.com/detail/5c45ca572d18e503f0362757.html
教師端UI設計
學生端UI設計
後端服務設計
首先新建StudentController和TeacherController,用於承載學生端和教師端的介面,然後分別新增Index Action並生成各自的Index.cshtml。
檢視建立好編寫各自的UI,實現基本的佈局和畫板功能。此處就不貼程式碼了,原始碼已託管到github,在文章末尾有連結。
新建 SignalRChat 資料夾並新增繼承 Hub 類 的TeacherHub.cs SignalR 集線器,然後在 Startup 中註冊該集線器。
我們的電子畫板專案是面向多教師的,每個教師可以開設自己的教學房間,房間的概念在 SignalR 中稱其為 Group。
新建 Models 資料夾並新增 RoomInfo.cs 類,該類對房間物件進行抽象,其有如下屬性:
在 TeacherHub 中新建字典型別的靜態欄位 _TeacherRooms 儲存教師建立的教師資訊,此處我們使用 C#執行緒安全的字典物件 ConcurrentDictionary。為啥要使用靜態欄位?因為客戶端每次連線hub的時候都會建立hub的新例項。
做完上面的這些,教師端就可以建立房間了。教師端建立房間的核心程式碼如下:
學生端登入後能夠獲取到所有線上的房間,並可以隨意的切換(加入)這些房間,獲取所有房間的核心程式碼如下:
房間建立後教師就可以在畫板上操作了,對canvas 的每一次操作行為都會經過Hub推送給加入該房間的所有客戶端。並且學生加入房間後應該能夠獲取到教師之前的講解內容,這就要求服務端要儲存這些操作行為。
在 Models 資料夾下新建 CanvasPoint.cs ,該類抽象 canvas 的操作行為,其定義如下:
在 TeacherHub 中新增 _CanvasPoint 靜態欄位用於儲存每個房間中教師對 canvas 的操作行為,該欄位為 ConcurrentDictionary 字典型別,key 為房間編號,value 為canvas操作行為的集合。
將教師端教師每次對canvas的操作儲存到_CanvasPoint 的核心實現:
學生端訂閱 ReceivePoint 事件,獲取到訊息後繪製canvas。
到此電子畫板的基本功能都已經實現了,由於篇幅問題,房間解散等其他功能的程式碼就不貼了,大家看原始碼吧。