不管是公司、學校和社會團體,都會舉辦各式各樣的活動,好比運動會、部門會議、項目會議、野炊、團建等。做爲團隊管理者來說,固然但願可以把這類活動轉移到線上造成完整的系統,相似於電子流的形式。本文以學院組織的全部活動爲例,實現一個這樣的系統。javascript
學院由不少班級組成,每一個班級由班幹部(如班長、團支書等,視爲二級管理員)和非班幹部(視爲普通成員),同時學院之下有不少老師(統稱爲教職工,視爲一級管理員)。php
咱們但願開發一個這樣的繫系統:css
綜上,能夠總結出,這樣的一個系統主要功能都集中在後端,前端只是實現一個簡單的掃碼簽到功能和活動查詢展現功能。html
過完前面的需求,一個大體的Mysql數據庫設計方案在腦海裏就已經造成了,咱們創建一個數據庫名爲:activity_sign_system,在該數據庫下創建以下數據表:前端
管理員表,存儲全部管理員信息。java
字段名 | 字段類型 | 備註信息 | 字段含義 |
---|---|---|---|
m_id | int(11) | 自增 | 自增編號 |
m_number | int(11) | 非空 | PK,學號或教職工號 |
m_name | varchar(30) | 非空 | 管理員姓名 |
m_class_id | int(11) | 非空 | 管理員所在班級 |
m_grade | tinyint(4) | 非空 | 學生入學年份/教職工入校年份 |
m_rivilege | tinyint(1) | 非空 | 1:超管;2:一級管理員;3:二級管理員 |
m_salt | char(256) | 非空 | 鹽值隨機數 |
m_password | varchar(512) | 非空 | sha256(m_salt+sha256(用戶密碼)) |
m_is_delete | tinyint(1) | 非空 | 1:帳戶已刪除;0:帳戶正常 |
m_create_time | timestamp | 非空 | 首次建立時間,YYYY-MM-DD HH:MM:SS |
m_update_time | timestamp | 非空 | 最後修改時間,YYYY-MM-DD HH:MM:SS |
m_delete_time | timestamp | 默認爲NULL | 軟刪除時間,YYYY-MM-DD HH:MM:SS |
活動表,存儲全部活動信息。mysql
字段名 | 字段類型 | 備註信息 | 字段含義 |
---|---|---|---|
a_id | int(11) | 自增 | PK,活動編號 |
m_number | int(11) | 非空 | FK,活動建立者,學號或教職工號 |
c_id | int(11) | 非空 | FK,組織活動的班級,班級ID |
a_name | varchar(200) | 非空 | 活動名稱 |
a_content | varchar(500) | 非空 | 活動內容 |
a_place | varchar(50) | 非空 | 活動地點 |
a_label | varchar(200) | 未選擇標籤則爲空 | 活動標籤 |
a_grade | tinyint(4) | 非空 | 活動面向的年級 |
a_start_time | timestamp | 非空 | 活動開始時間,YYYY-MM-DD HH:MM:SS |
a_end_time | timestamp | 非空 | 活動結束時間,YYYY-MM-DD HH:MM:SS |
a_start_sign | timestamp | 能夠爲空,發佈活動時輸入 | 開始簽到時間,YYYY-MM-DD HH:MM:SS |
a_end_sign | timestamp | 能夠爲空,發佈活動時輸入 | 結束簽到時間,YYYY-MM-DD HH:MM:SS |
a_is_delete | tinyint(1) | 非空 | 1:已刪除;0:正常 |
a_create_time | timestamp | 非空 | 首次建立時間,YYYY-MM-DD HH:MM:SS |
a_update_time | timestamp | 非空 | 最後修改時間,YYYY-MM-DD HH:MM:SS |
a_delete_time | timestamp | 默認爲NULL | 軟刪除時間,YYYY-MM-DD HH:MM:SS |
班級表,存儲全部班級信息。git
字段名 | 字段類型 | 備註信息 | 字段含義 |
---|---|---|---|
c_id | int(11) | 自增 | PK,班級ID |
c_name | varchar(100) | 非空 | 班級名稱 |
c_is_delete | tinyint(1) | 非空 | 1:已刪除;0:正常 |
c_create_time | timestamp | 非空 | 首次建立時間,YYYY-MM-DD HH:MM:SS |
c_update_time | timestamp | 非空 | 最後修改時間,YYYY-MM-DD HH:MM:SS |
c_delete_time | timestamp | 默認爲NULL | 軟刪除時間,YYYY-MM-DD HH:MM:SS |
標籤表,存儲全部的活動標籤信息。github
字段名 | 字段類型 | 備註信息 | 字段含義 |
---|---|---|---|
l_id | int(11) | 自增 | PK,標籤ID |
l_name | varchar(50) | 非空 | 標籤名稱 |
l_is_delete | tinyint(1) | 非空 | 1:已刪除;0:正常 |
l_create_time | timestamp | 非空 | 首次建立時間,YYYY-MM-DD HH:MM:SS |
l_update_time | timestamp | 非空 | 最後修改時間,YYYY-MM-DD HH:MM:SS |
l_delete_time | timestamp | 默認爲NULL | 軟刪除時間,YYYY-MM-DD HH:MM:SS |
活動與標籤關聯表,活動與標籤是多對多的關係,一個標籤能夠在多個活動中,一個活動也能夠有多個標籤。web
字段名 | 字段類型 | 備註信息 | 字段含義 |
---|---|---|---|
a2l_id | int(11) | 自增 | PK,編號 |
a_id | int(11) | 非空 | FK,活動ID |
l_id | int(11) | 非空 | FK,標籤ID |
a2l_is_delete | tinyint(1) | 非空 | 1:已刪除;0:正常 |
a2l_create_time | timestamp | 非空 | 首次建立時間,YYYY-MM-DD HH:MM:SS |
a2l_update_time | timestamp | 非空 | 最後修改時間,YYYY-MM-DD HH:MM:SS |
a2l_delete_time | timestamp | 默認爲NULL | 軟刪除時間,YYYY-MM-DD HH:MM:SS |
活動出席表,記錄了每項活動的全部出席學生,活動與學生爲多對多的關係,一個活動能夠有多個學生參加,一個學生也能夠參加多個活動。
字段名 | 字段類型 | 備註信息 | 字段含義 |
---|---|---|---|
a2s_id | int(11) | 自增 | PK,編號 |
a_id | int(11) | 非空 | FK,活動ID |
m_number | int(11) | 非空 | FK,學號或教職工號,若爲普通成員也是填寫學號 |
m_name | varchar(30) | 非空 | 管理員姓名,若爲普通成員也是填寫姓名 |
a2s_sign_time | timestamp | 非空 | 學生掃碼簽入時間,YYYY-MM-DD HH:MM:SS |
a2s_is_delete | tinyint(1) | 非空 | 1:已刪除;0:正常 |
a2s_create_time | timestamp | 非空 | 首次建立時間,YYYY-MM-DD HH:MM:SS |
a2s_update_time | timestamp | 非空 | 最後修改時間,YYYY-MM-DD HH:MM:SS |
a2s_delete_time | timestamp | 默認爲NULL | 軟刪除時間,YYYY-MM-DD HH:MM:SS |
日誌表,存儲全部帳戶的日誌信息(登錄、修改、添加、刪除、導入、導出)。
字段名 | 字段類型 | 備註信息 | 字段含義 |
---|---|---|---|
lg_id | int(11) | 自增 | PK,日誌編號 |
m_number | int(11) | 非空 | FK,操做者的學號或教職工號 |
lg_time | timestamp | 非空 | 操做時間,YYYY-MM-DD HH:MM:SS |
lg_type | tinyint(1) | 非空 | 1:登錄;2:添加;3:修改;4:刪除;5:導入;6:導出 |
lg_table | varchar(30) | 非空 | 操做的數據表 |
lg_action | json | 僅登錄才爲空 | 具體操做內容,具體到行和字段 |
lg_os | varchar(30) | 非空 | 操做者的系統(如mac、windows、unix等) |
lg_brower | varchar(30) | 非空 | 操做者的瀏覽器(如Firefox、safari等) |
lg_ip | int | 非空 | 操做者IP轉int後的值,inet_aton(IP) |
服務端能夠選擇Django、SpringBoot和thinkPHP框架,因爲這樣的系統自己並無多大的用戶量,一個學校的本碩博在校人數總和也不會超過10萬,所以咱們不用去考慮從此用戶爆發式增加帶來的瓶頸問題。再考慮到Django和thinkPHP這兩個框架本身都用過,SpringBoot未使用過,所以這裏選擇thinkPHP5.0 + Mysql + Linux + Apache2。
既然前面都分析完了,內心已經很明確須要作什麼事情了,第一步固然是在本身購買的服務器上部署LAMP環境了,如何部署,詳見我另外一篇文章Linux下Docker快速部署LAMP
以下列出主要的模塊。
. ├── application │ ├── actquery // 活動信息管理模塊 │ │ ├── controller │ │ ├── model │ │ └── view │ ├── adminquery // 管理員信息管理模塊 │ │ ├── controller │ │ ├── model │ │ └── view │ ├── attendquery // 活動出席名單統計模塊 │ │ ├── controller │ │ ├── model │ │ └── view │ ├── classquery // 班級信息管理模塊 │ │ ├── controller │ │ ├── model │ │ └── view │ ├── common // 提取的公共模塊 │ │ ├── controller │ │ ├── model │ │ └── view │ ├── common.php │ ├── config.php │ ├── database.php │ ├── index │ │ ├── controller │ │ └── view │ ├── labelquery // 標籤信息管理模塊 │ │ ├── controller │ │ ├── model │ │ └── view │ ├── login // 登錄與鑑權模塊 │ │ ├── controller │ │ ├── model │ │ └── view │ ├── logmanage // 日誌管理模塊 │ │ ├── controller │ │ ├── model │ │ └── view │ ├── route.php │ ├── tags.php │ └── wxcampus // 微信端H5開發模塊 │ ├── common │ ├── controller │ ├── model │ └── view ├── build.php ├── extend ├── public │ ├── favicon.ico │ ├── index.html │ ├── index.php │ ├── router.php │ └── static ├── README.md ├── runtime ├── think ├── thinkphp └── vendor ├── PHPExcel // Excel導入/導出須要用到 │ └── PHPExcel.php ├── phpoffice │ └── phpspreadsheet └── phpqrcode // 發佈簽到生成二維碼須要 └── phpqrcode.php
實際開發過程當中,對於敏感信息咱們都須要進行加密傳輸,必定不能傳輸明文,不然很容易被攻擊者抓包獲取到用戶信息,manage_info表中m_password字段存儲的並非用戶密碼直接加密後的HASH值,若是直接存儲用戶密碼加密後的HASH值,那麼也很容易被攻擊者暴力破解。
本系統中給每一個用戶隨機生成了一個m_salt字符串,用戶登錄的時候對用戶的密碼採用SHA256計算一次HASH,網絡傳輸過程當中也是傳輸的該HASH值,後臺收到該HASH值後,拼接到m_salt以後,而後對拼接後的整個字符串使用SHA256算法從新計算一次新的HASH值,並把該新的HASH值存儲到數據表中。所以只要攻擊者未攻破後臺數據庫,想要拿到用戶的密碼是很是困難的,除非數據庫被拖庫。
不過,值得一提的是,企業項目實踐過程當中,若是對加密要求很是嚴格的話,數據庫中也不會存儲m_salt的明文,徹底能夠採用對稱加密算法的密鑰對m_salt加密後再存儲到數據庫中,這樣一來就算數據庫被攻破,也可以保證用戶帳戶密碼的安全性。
https://github.com/icoty/sign_system
[1] thinkPHP5徹底開發手冊
[2] PHPExcel
[3] phpqrcode
[4] mysql數據庫設計規範與原則
[5] 經常使用加密算法應用
[6] html教程
[7] css教程