一、選課系統概述
由於我的工程實踐項目是NLP,對算法無法進行需求分析。所以我借用比較常見的學生選課系統進行需求分析,作為本次作業。選課系統中的最主要的使用者是學生與管理員,后面將圍繞一個簡單的選課系統進行需求分析,不考慮搶課等復雜的功能。
二、用例圖
用例圖如下所示,選課系統中兩個主要的角色:管理員、學生。管理員負責課程信息、學生信息與選課規則的增刪改查;而學生可以選課、退課、查看課程信息、查看自己的課表,同時學生可以修改自己的個人信息,但是修改的權限低於管理員,像學號等信息學生不能修改。

三、業務類圖
選課系統的業務類圖如下所示。學生與管理員都有登錄登出的方法,而課程、選課規則與學生都有增刪改查。學生信息包括學號(id)、姓名(name)、性別(sex)、郵箱(email)、班級(class)、年級(grade);課程包括課程編號(id)、課程名字(name)、教室(classroom)、老師(teacher)、上課周(weeks)、上課時間(times)、課程介紹(comment)、學分(score)、選課人數上限(capacity);管理員只包括編號(id)、姓名(name)與權限(authority)。

四、數據模型
Student表
| 列名 | 數據類型 | 數據長度 | 是否可為NULL | 是否唯一 | 是否為主鍵 | 注釋 |
| UUID | string | 256 | N | Y | Y | 通用唯一識別碼 |
| sId | string | 10 | N | Y | N | 學號 |
| class | string | 256 | N | N | N | 班級 |
| grade | string | 256 | N | N | N | 年級 |
| passwd | string | 256 | N | N | N | 密碼 |
| name | string | 20 | N | N | N | 姓名 |
| sex | string | 4 | N | N | N | 性別 |
| authority | int | 1 | N | N | N | 權限 |
| string | 256 | Y | N | N | 郵箱 |
Administrator表
| 列名 | 數據類型 | 數據長度 | 是否可為NULL | 是否唯一 | 是否為主鍵 | 注釋 |
| UUID | string | 256 | N | Y | Y | 通用唯一識別碼 |
| aId | string | 10 | N | Y | N | 管理員統一編號 |
| passwd | string | 256 | N | N | N | 密碼 |
| name | string | 20 | N | N | N | 姓名 |
| sex | string | 4 | N | N | N | 性別 |
| authority | int | 1 | N | N | N | 權限 |
| string | 256 | Y | N | N | 郵箱 |
Course表
| 列名 | 數據類型 | 數據長度 | 是否可為NULL | 是否唯一 | 是否為主鍵 | 注釋 |
| UUID | string | 256 | N | Y | Y | 通用唯一識別碼 |
| cId | string | 10 | N | Y | N | 課程統一編號 |
| teacher | string | 256 | N | N | N | 授課老師姓名 |
| name | string | 20 | N | N | N | 課程名稱 |
| weeks | string | 256 | N | N | N | 開課周 |
| times | string | 256 | N | N | N | 上課時間 |
| score | float | 10 | N | N | N | 學分 |
| classroom | string | 256 | N | N | N | 上課地點 |
| comment | string | 256 | N | N | N | 課程描述 |
| capacity | int | 3 | N | N | N | 選課人數上限 |
Rule表
| 列名 | 數據類型 | 數據長度 | 是否可為NULL | 是否唯一 | 是否為主鍵 | 注釋 |
| UUID | string | 256 | N | Y | Y | 通用唯一識別碼 |
| rId | string | 256 | N | Y | N | 規則統一編號 |
| cId | string | 256 | N | Y | N | 課程統一編號 |
| grade | string | 256 | N | N | N | 限選年級 |
| name | string | 20 | N | N | N | 課程名稱 |
| class | string | 256 | N | N | N | 限選班級 |
| startTime | string | 256 | N | N | N | 生效開始時間 |
| endTime | string | 256 | N | N | N | 生效結束時間 |
CourseSelection表
| 列名 | 數據類型 | 數據長度 | 是否可為NULL | 是否唯一 | 是否為主鍵 | 注釋 |
| UUID | string | 256 | N | Y | Y | 通用唯一識別碼 |
| sId | string | 10 | N | Y | N | 學號 |
| cId | string | 256 | N | Y | N | 課程統一編號 |
五、概念原型及工作流程
學生、課程、與選課規則信息全部由管理員統一導入、修改、刪除。學生可以修改自己部分個人信息,但是不能修改學號、姓名、性別等關鍵信息。在選課時,按照提前導入的選課規則規定什么時間段內哪個年級哪些班的學生可以選什么樣的課。其中涉及可能存在的列表類型的數據統一使用json格式的字符串存儲。在后台,按照微服務的思想,不同的功能分開實現,服務與服務之間通過kafka通信,避免服務之間重復調用造成邏輯混亂與流程延遲。在數據庫方面,對了應對選課時間段內的集中操作,可以先使用redis,待選課完成再同步到數據庫中。
在查找方面,可以使用Elasticsearch完善查找功能,方便同學根據關鍵詞准確有效地查找課程信息,完善自己的課表。
