# AHNU-circulation-desk
php程序设计课程大作业——基于PHP、MySQL的web端借还书系统
本项目已部署,地址:[http://library.jortana.top/](http://library.jortana.top/)
## TODO
* [x] 数据库设计
* [x] 用户注册页面
* [x] 用户登陆页面
* [x] 主页面
* [x] 借书
* [x] 还书
* [x] 个人信息管理
* [x] 管理员部分
* [x] 公告
* [x] reCAPTCHA验证~~验证码校验登录~~
* [x] 模糊查询
* [x] 快到期图书提醒
* [x] 个人历史纪录
* [x] 通过邮箱找回密码(使用了PHPMailer,简直是救星)
* [x] 系统说明
* [ ] ~~统计模块~~(可以用Echarts生成图表,但由于只是DEMO,意义不是特别大,主要也没啥数据,生成的图表看起来很一般)
* [ ] 代码重构与优化
项目中很多都可以用vue重构,但是因为不是很熟悉,为了不要让自己做的太慢,所以基本都是用jQuery。但是如果都用vue应该会精简很多
# 借还书系统系统说明
## 如何部署
1. `fork`或`clone`本项目;
2. 更改相关的数据库信息(`t/db.php`);
3. 配置你自己的邮件发送模块(`t/neteast_mailter.php`);
4. 做完上述两步后将php文件放到安全的位置并更改`php/bd_fns.php`中引用的链接;
5. 使用`createdb.sql`文件创建本项目的数据库:
* 在命令行下使用命令`mysql –u用户名 –p密码 <【sql脚本文件路径】` 或
* 在MySQL控制台中使用命令`source 【sql脚本文件路径】`
6. [申请](http://www.google.com/recaptcha/admin)Google reCAPTCHA的API key并填入相关代码(如不用验证功能可以跳过此步骤并且删除相关代码);
7. 保持文件夹的结构复制到你所需要的目录(不要忘了删除文件夹`t`)。
## 结构说明
本项目每一个页面均对应1-2个css、js文件以及后台的php文件,html、css和js的文件名是同名的,可以清晰地看出对应关系,其中:
* `css`文件夹中存放了所有的.css文件,`js`中存放了所有的.js文件
* `account`文件夹中存放的是用户注册、登录、历史纪录以及个人信息的页面;
* `b_and_r`文件夹中存放的是借还书的页面
* `img`文件夹中存放的是导航栏下面的背景图片的图片文件
* `lib`文件夹中存放了后台PHP共同使用的函数`db_fns.php`和两个PHPMailer的库文件
* `php`文件夹中的文件较为复杂,但都以功能命名
## 测试系统环境
* Ubuntu 16.04.1
* Apache 2.4.18
* PHP 7.0.33
* MySQL 5.7.25
## 功能描述
* 整体设计思路:
* 所有用户均可访问主页面和借书页面以查询想要的图书信息;
* 主页面主要是一个搜素框用户搜索图书,以及一个显示公告的作用;
* 借书和还书的操作必须登录后使用;
* 读者可以查看历史记录和个人信息
* 管理员可以发布公告
* 用户信息管理模块:
* 注册功能。前后端均设置了表单验证和安全防范;
* 登录功能。使用了reCAPTCHA验证系统,支持使用邮箱找回密码的功能;
* 历史纪录。用户可以查看借还书的历史记录,包括书名、作者、分类、出版社等图书基本信息以及借阅时间、归还时间、超期处罚金额等信息,其中绿色表示按时归还,红色表示超期归还;
* 个人信息管理。包括三个大部分,分别是账户、安全和借阅:
* 账户:包括显示学号、姓名、性别、年级、专业、手机和电子邮箱等信息,用户可以修改手机号和电子邮箱地址;
* 安全:包括了更改密码的功能;
* 借阅:包括显示借书次数、超期次数和信用等级。信用等级可以用作提升或减少用户可借图书本数和借阅时长,这个功能暂时没有实装;
* 借还书功能
* 借书:
* 用户可以通过书名、作者、分类三个维度搜索图书,每个维度都支持模糊搜索(关键字查询),但不同维度之间没有实现此功能;
* 搜索出的结果包含了书名、作者、分类、出版社、复本数以及剩余数等信息;
* 用户在检索到想要看的图书后直接点击“借阅”按钮即可完成借阅,若用户已经借阅了三本图书未归还或有超期未归还的图书不得借阅新的图书;
* 本项目使用的图书数据超过12万条,但由于对于豆瓣网站的图书分类方法不清楚,且没有注意数据的精处理,有许多相同的图书但分类不同的图书被认为是不同的图书,但是不影响使用(毕竟没有真书),在基础数据上,将数据复制三份,以达到每本图书都有三本复本的要求;
* 还书:
* 在还书页面,用户可以看到自己正在借阅的图书的信息,包括书名、作者、分类、出版社、借阅时间、最晚归还时间和超期处罚金额等信息;
* 淡蓝色显示的是未超期的图书,红色显示的是超期的图书,对于未超期图书直接点击归还即可归还,对于超期图书需要点击缴费并归还,此时会有一个alert窗口以代替付款的流程;
* 若用户有在24小时内超期的图书,在导航栏的“还书”按钮旁会显示即将超期的图书的数量以达到提示用户的作用;
* 管理员系统:
* 管理员使用发放的账号和密码,不可通过注册页面注册;
* 管理员登录和普通用户使用相同的登录页,并且没有多余的操作;
* 管理员登录后所看到的导航栏是不同的;
* 目前暂时只做了发布公告的功能;
* **注1**:本项目采取前后端分离的设计模式,由于经验不足,逻辑可能稍显混乱,但在设计和开发上比较容易增删模块和查找错误原因。前端和后端的交互均通过Ajax实现,用户体验较好;
* **注2**:所有页面均设置了防止误操作、直接通过地址访问等非法访问的用户友好界面提示。对于通过直接发送数据包的行为也做了一定的防范。
## 数据库设计
### 数据库概念结构设计
* 读者实体:**用户编号**、姓名、性别、年级、专业、被处罚次数、诚信度
* 图书实体:**书籍编号**、书名、作者、出版社、分类、登记日期
* 用户实体:**用户编号**、密码
### 数据库逻辑结构设计
* 读者(读者编号、姓名、性别、年级、专业、被处罚次数、诚信度)
* 图书(图书编号、书名、作者、出版社、分类、登记日期)
* 用户(用户编号、电话号码、邮箱、密码、重置密码)
* 图书借还(用户编号、图书编号、借书时间、预期归还时间、实际归还时间)
* 处罚信息(用户编号、图书编号、超期天数、处罚金额、是否缴纳处罚)
* 管理员(管理员编号、管理员姓名、管理员电话、管理员邮箱、管理员密码)
* 公告(公告编号、公告内容、发布的管理员、发布时间)
### 数据库物理结构设计
#### 1.用户信息表(User)
| 名字 | 数据类型 | 是否为空 | 键 | 说明 |
| ------------- | ------------ | -------- | --- | -------------- |
| user_ID | int | NO | PRI | 用户编号 |
| stu_number | char(12) | NO | | 学号 |
| user_phone | char(12) | NO | | 用户手机号 |
| user_email | varchar(255) | NO | | 用户邮箱 |
| user_pass | char(50) | NO | | 密码 |
| get_pass_time | datetime | | | 重置密码的时间 |
#### 2.读者信息表(Reader)
| 名字 | 数据类型 | 是否为空 | 键 | 说明 |
| ---------- | -------- | -------- | --- | ---------- |
| user_ID | int | NO | PRI | 用户编号 |
| user_name | char(20) | NO | | 用户姓名 |
| user_sex | char(4) | NO | | 性别 |
| user_grad