不管是公司、学校和社会团体,都会举办各式各样的活动,好比运动会、部门会议、项目会议、野炊、团建等。做为团队管理者来说,固然但愿可以把这类活动转移到线上造成完整的系统,相似于电子流的形式。本文以学院组织的全部活动为例,实现一个这样的系统。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教程