基於LAMP實現後臺活動發佈和前端掃碼簽到系統

目的

不管是公司、學校和社會團體,都會舉辦各式各樣的活動,好比運動會、部門會議、項目會議、野炊、團建等。做爲團隊管理者來說,固然但願可以把這類活動轉移到線上造成完整的系統,相似於電子流的形式。本文以學院組織的全部活動爲例,實現一個這樣的系統。javascript

羣體

學院由不少班級組成,每一個班級由班幹部(如班長、團支書等,視爲二級管理員)和非班幹部(視爲普通成員),同時學院之下有不少老師(統稱爲教職工,視爲一級管理員)。php

指望需求

咱們但願開發一個這樣的繫系統:css

  1. 一級和二級管理員可以在系統內建立活動,並可以記錄活動詳細信息(如活動名稱、活動內容、活動建立人、活動開始時間、活動結束時間、活動開展地點、活動類型等);
  2. 建立活動時能夠爲本活動選擇活動標籤,標籤記錄了屬於什麼類型的活動,好比德育、體育、學術等;
  3. 對於每一項活動,都有一個發佈簽到的功能,會生成一個二維碼,二級管理員和普通成員經過微信掃描二維碼就能將本身的出席信息記錄到系統中;
  4. 二級管理員發佈簽到時僅可以發佈那些由其本人建立的活動,一級管理員發佈簽到時可以發佈所有活動;
  5. 提供導出活動列表的功能,二級管理員僅能導出本班建立的全部活動,一級管理員可以導出全部活動;
  6. 提供導出活動出席名單的功能,二級管理員僅能導出由其本班組織的活動的活動出席名單,一級管理員可以導出全部活動的活動出席名單;
  7. 提供導入活動出席名單的功能,二級管理員和一級管理員均可以導入全部活動的活動出席名單,前提是該活動在系統中已經存在;
  8. 不提供管理員註冊接口,全部的一級管理員帳戶均由admin(超管帳戶)建立,一級管理員能夠建立二級管理員帳戶,admin能夠修改全部帳戶信息,除此以外,全部管理員帳戶都不能對其餘帳戶進行修改;
  9. 管理員忘記帳戶密碼後,能夠經過手機重置密碼;
  10. 系統中須要可以記錄全部帳戶的日誌信息(登錄、添加、修改、刪除、導入、導出);
  11. 二級管理員和普通成員經過微信端須要可以查看本身歷史以來參加了哪些活動。

綜上,能夠總結出,這樣的一個系統主要功能都集中在後端,前端只是實現一個簡單的掃碼簽到功能和活動查詢展現功能。html

Mysql數據庫&數據表設計

過完前面的需求,一個大體的Mysql數據庫設計方案在腦海裏就已經造成了,咱們創建一個數據庫名爲:activity_sign_system,在該數據庫下創建以下數據表:前端

manage_info

管理員表,存儲全部管理員信息。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

activity_info

活動表,存儲全部活動信息。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

class_info

班級表,存儲全部班級信息。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

label_info

標籤表,存儲全部的活動標籤信息。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

act2label

活動與標籤關聯表,活動與標籤是多對多的關係,一個標籤能夠在多個活動中,一個活動也能夠有多個標籤。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

act2stu

活動出席表,記錄了每項活動的全部出席學生,活動與學生爲多對多的關係,一個活動能夠有多個學生參加,一個學生也能夠參加多個活動。

字段名 字段類型 備註信息 字段含義
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

log_info

日誌表,存儲全部帳戶的日誌信息(登錄、修改、添加、刪除、導入、導出)。

字段名 字段類型 備註信息 字段含義
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。

web端/微信端

  • web端其實也就是後臺管理部分可視化界面的呈現,須要使用html、css、javascript知識;
  • 微信端使用H5開發,除了要適配手機微信頁面外,與web端基本無差別。

需求拆解與編碼實現

LAMP搭建

既然前面都分析完了,內心已經很明確須要作什麼事情了,第一步固然是在本身購買的服務器上部署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

登錄&鑑權加密設計

  • sha256算法實現參見項目文件:public/static/assets/js/lib/sha256/sha256.js;

實際開發過程當中,對於敏感信息咱們都須要進行加密傳輸,必定不能傳輸明文,不然很容易被攻擊者抓包獲取到用戶信息,manage_info表中m_password字段存儲的並非用戶密碼直接加密後的HASH值,若是直接存儲用戶密碼加密後的HASH值,那麼也很容易被攻擊者暴力破解。

本系統中給每一個用戶隨機生成了一個m_salt字符串,用戶登錄的時候對用戶的密碼採用SHA256計算一次HASH,網絡傳輸過程當中也是傳輸的該HASH值,後臺收到該HASH值後,拼接到m_salt以後,而後對拼接後的整個字符串使用SHA256算法從新計算一次新的HASH值,並把該新的HASH值存儲到數據表中。所以只要攻擊者未攻破後臺數據庫,想要拿到用戶的密碼是很是困難的,除非數據庫被拖庫。

不過,值得一提的是,企業項目實踐過程當中,若是對加密要求很是嚴格的話,數據庫中也不會存儲m_salt的明文,徹底能夠採用對稱加密算法的密鑰對m_salt加密後再存儲到數據庫中,這樣一來就算數據庫被攻破,也可以保證用戶帳戶密碼的安全性。

導入導出&二維碼生成

  • 導入導出使用使用github上的 PHPExcel 實現;
  • 生成二維碼使用github上的 phpqrcode 實現。

部分頁面效果圖

源碼

https://github.com/icoty/sign_system

參考文獻

[1] thinkPHP5徹底開發手冊
[2] PHPExcel
[3] phpqrcode
[4] mysql數據庫設計規範與原則
[5] 經常使用加密算法應用
[6] html教程
[7] css教程

相關文章
相關標籤/搜索